Xiang, L., Yin, Y., Zheng, Y., Ma, Y., Li, Y., Zhao, Z., Guo, J., Ai, Z., Niu, Y., Duan, K., et al. (2020). A developmental landscape of 3D-cultured human pre-gastrulation embryos. Nature 577, 537–542.

  • BioProject Accession: PRJNA562548
  • GEO Accession: GSE136447



Load required packages.

library(tidyverse)
library(magrittr)
library(Matrix)
library(Seurat)
library(extrafont)
library(patchwork)
# library(tidylog)
Sys.Date()
## [1] "2020-07-30"

Functions loading

source(
    file = file.path(
        SCRIPT_DIR,
        "utilities.R"
    )
)

Data loading

Load SRA run info.

cell_metadata <- read_delim(
    file = "../SraRunTable.txt",
    delim = ","
)
## Parsed with column specification:
## cols(
##   .default = col_character(),
##   AvgSpotLen = col_double(),
##   Bases = col_double(),
##   Bytes = col_double(),
##   ReleaseDate = col_datetime(format = "")
## )
## See spec(...) for full column specifications.
cell_metadata$Cell_type %>%
    table()
## .
##      CTBs       EPI      EVTs Hypoblast       ICM   PSA-EPI      STBs 
##       159       126        40        25        52        44       109
cell_metadata %>% head()

Prepare metadata for single cells.

embedding <- read_csv(
    file = "embedding_ncomponents31_seed20200317.csv"
) %>%
    left_join(
        cell_metadata[, c("Run", "Age", "Cell_type", "Sample Name")],
        by = c("cell" = "Run")
    ) %>%
    rename(
        develpmental_stage = Age,
        cell_type = Cell_type,
        sample_name = `Sample Name`
    ) %>%
    mutate(
        louvain = factor(louvain),
        #
        develpmental_stage = str_replace(
            string = develpmental_stage,
            pattern = "embryo invitro day ",
            replacement = "E"
        ),
        develpmental_stage = factor(
            develpmental_stage,
            levels = stringr::str_sort(
                x = unique(develpmental_stage),
                numeric = TRUE
            )
        ),
        cell_type = factor(
            cell_type,
            levels = c(
                "ICM",
                "EPI",
                "PSA-EPI",
                "Hypoblast",
                "CTBs",
                "STBs",
                "EVTs"
            )
        )
    )
## Parsed with column specification:
## cols(
##   cell = col_character(),
##   batch = col_character(),
##   louvain = col_double(),
##   x_tsne = col_double(),
##   y_tsne = col_double(),
##   x_umap = col_double(),
##   y_umap = col_double(),
##   x_fitsne = col_double(),
##   y_fitsne = col_double(),
##   x_phate = col_double(),
##   y_phate = col_double(),
##   `x_min_dist=0.1` = col_double(),
##   `y_min_dist=0.1` = col_double(),
##   x_multicoretsne = col_double(),
##   y_multicoretsne = col_double()
## )
embedding %>% head()
reticulate::py_discover_config()
## python:         /Users/jialei/.pyenv/shims/python
## libpython:      /Users/jialei/.pyenv/versions/3.8.2/lib/libpython3.8.dylib
## pythonhome:     /Users/jialei/.pyenv/versions/3.8.2:/Users/jialei/.pyenv/versions/3.8.2
## version:        3.8.2 (default, May 23 2020, 03:35:41)  [Clang 11.0.3 (clang-1103.0.32.62)]
## numpy:          /Users/jialei/.pyenv/versions/3.8.2/lib/python3.8/site-packages/numpy
## numpy_version:  1.19.0
## 
## NOTE: Python version was forced by RETICULATE_PYTHON
np <- reticulate::import("numpy", convert = TRUE)
scipy.sparse <- reticulate::import(module = "scipy.sparse", convert = TRUE)

matrix_readcount_use <- scipy.sparse$load_npz("../matrix_readcount.npz")
matrix_readcount_use_features <- np$load("../matrix_readcount_features.npy")
matrix_readcount_use_barcodes <- np$load("../matrix_readcount_barcodes.npy")
colnames(matrix_readcount_use) <- matrix_readcount_use_barcodes
# rownames(matrix_readcount_use) <- matrix_readcount_use_features
rownames(matrix_readcount_use) <- paste(
    gene_symbo_info$X1,
    gene_symbo_info$X2,
    sep = "_"
)
matrix_readcount_use <- matrix_readcount_use[, embedding$cell]

# calculate CPM
matrix_cpm_use <- calc_cpm(matrix_readcount_use)

stopifnot(
    dim(matrix_readcount_use) == dim(matrix_cpm_use)
)
print(dim(matrix_readcount_use))
## [1] 33538   555
walk(list(embedding, matrix_readcount_use, matrix_cpm_use), function(x) {
    print(object.size(x), units = "auto", standard = "SI")
})
## 193.6 kB
## 71.6 MB
## 71.6 MB

Visualization

Clusters

embedding %>%
    mutate(
        num_umis = colSums(matrix_readcount_use[, cell]),
        num_genes = colSums(matrix_readcount_use[, cell] > 0)
    ) %>%
    group_by(louvain) %>%
    summarise(
        num_cell = n(),
        median_umis = median(num_umis),
        median_genes = median(num_genes)
    ) %>%
    xtable::xtable()
## `summarise()` ungrouping output (override with `.groups` argument)
# stargazer::stargazer()
p_embedding_cluster <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$louvain %>% as.factor(),
    label = "Cluster",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = 1,
    sort_values = FALSE
)
p_embedding_cluster +
    scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain)))
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

Distribution of UMIs

# Embedding
plot_embedding_value(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = matrix_readcount_use[, embedding$cell] %>%
        colSums(),
    colorbar_position = c(0.86, 0.28),
    label = "UMI distribution",
    label_position = NULL,
    # label_position = c(label_x, label_y),
    geom_point_size = 1,
    sort_values = FALSE,
    FUN = function(x) log10(x)
)

Distribution of samples

Development stage

prepare_cluster_composition(
    embedding = embedding,
    x = louvain, group = develpmental_stage
) %>%
    select(-num_cells) %>%
    pivot_wider(
        names_from = develpmental_stage,
        values_from = percentage
    ) %>%
    replace(is.na(.), 0) %>%
    print(n = nrow(.))
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` regrouping output by 'louvain' (override with `.groups` argument)
## # A tibble: 8 x 9
## # Groups:   louvain [8]
##   louvain     E6     E7     E8     E9    E10    E12  E13.5    E14
##   <fct>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 0       0.228  0.140  0.0789 0.0789 0.114  0.175  0.0263 0.158 
## 2 1       0.0460 0.494  0.149  0.103  0.0460 0.103  0.0115 0.0460
## 3 2       0      0      0      0.0349 0.163  0.337  0.0814 0.384 
## 4 3       0      0      0.208  0.181  0.375  0.125  0.0139 0.0972
## 5 4       0      0.0278 0.306  0.472  0.194  0      0      0     
## 6 5       0      0      0      0      0.109  0.435  0.0652 0.391 
## 7 6       0      0      0      0      0      0.0244 0      0.976 
## 8 7       0.892  0.108  0      0      0      0      0      0
p_barplot_cluster_composition_develpmental_stage <- prepare_cluster_composition(
    embedding = embedding,
    x = louvain, group = develpmental_stage
) %>%
    arrange(louvain) %>%
    plot_barplot(x = louvain, y = percentage, z = develpmental_stage) +
    scale_fill_manual(
        values = ggthemes::tableau_color_pal("Tableau 20")(
            length(unique(embedding$develpmental_stage))
        )
    )
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` regrouping output by 'louvain' (override with `.groups` argument)

Cell type

embedding %<>%
    mutate(
        cell_type_full = as.character(cell_type),
        cell_type_full = case_when(
            cell_type_full == c("CTBs") ~ "Cytotrophoblasts",
            cell_type_full == c("STBs") ~ "Syncytiotrophoblasts",
            cell_type_full == c("EVTs") ~ "Extravillous cytotrophoblasts",
            cell_type_full == c("PSA-EPI") ~ "Primitive streak anlage - epiblast",
            cell_type_full == c("EPI") ~ "Epiblast",
            cell_type_full == c("ICM") ~ "Inner cell mass",
            TRUE ~ .data$cell_type_full
        ),
        #
        cell_type2 = as.character(cell_type),
        cell_type2 =
            case_when(
                cell_type2 == c("CTBs") ~ "TE",
                cell_type2 == c("STBs") ~ "TE",
                cell_type2 == c("EVTs") ~ "TE",
                cell_type2 == c("PSA-EPI") ~ "EPI",
                cell_type2 == c("Hypoblast") ~ "HYP",
                TRUE ~ .data$cell_type2
            ),
        #
        cell_type_full = factor(
            cell_type_full,
            levels = c(
                "Inner cell mass",
                "Epiblast",
                "Primitive streak anlage - epiblast",
                "Hypoblast",
                "Cytotrophoblasts",
                "Syncytiotrophoblasts",
                "Extravillous cytotrophoblasts"
            )
        ),
        #
        cell_type2 = factor(
            cell_type2,
            levels = c("ICM", "EPI", "HYP", "TE")
        )
    )
embedding %>%
    dplyr::count(cell_type, cell_type_full, name = "num_cells") %>%
    arrange(cell_type)
prepare_cluster_composition(
    embedding = embedding,
    x = louvain, group = cell_type
) %>%
    select(-num_cells) %>%
    pivot_wider(
        names_from = cell_type,
        values_from = percentage
    ) %>%
    replace(is.na(.), 0) %>%
    print(n = nrow(.))
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` regrouping output by 'louvain' (override with `.groups` argument)
## # A tibble: 8 x 8
## # Groups:   louvain [8]
##   louvain    EPI    ICM `PSA-EPI` Hypoblast   CTBs  EVTs   STBs
##   <fct>    <dbl>  <dbl>     <dbl>     <dbl>  <dbl> <dbl>  <dbl>
## 1 0       1      0         0          0     0      0     0     
## 2 1       0.0345 0.172     0.0230     0.287 0.483  0     0     
## 3 2       0.0116 0         0.0116     0     0.512  0.465 0     
## 4 3       0      0         0.0417     0     0.0556 0     0.903 
## 5 4       0.0139 0.0139    0          0     0.958  0     0.0139
## 6 5       0.0217 0         0.0435     0     0      0     0.935 
## 7 6       0.122  0         0.878      0     0      0     0     
## 8 7       0.0270 0.973     0          0     0      0     0
p_barplot_cluster_composition_cell_type <- prepare_cluster_composition(
    embedding = embedding,
    x = louvain, group = cell_type
) %>%
    arrange(louvain) %>%
    plot_barplot(x = louvain, y = percentage, z = cell_type) +
    scale_fill_manual(
        values = ggthemes::tableau_color_pal("Tableau 10")(
            length(unique(embedding$cell_type))
        )
    )
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` regrouping output by 'louvain' (override with `.groups` argument)
# combine plots
p_barplot_cluster_composition_develpmental_stage +
    p_barplot_cluster_composition_cell_type +
    plot_annotation(theme = theme(plot.margin = margin())) +
    plot_layout(guides = "collect")

Cell type; merged

prepare_cluster_composition(
    embedding = embedding,
    x = louvain, group = cell_type2
) %>%
    select(-num_cells) %>%
    pivot_wider(
        names_from = cell_type2,
        values_from = percentage
    ) %>%
    replace(is.na(.), 0) %>%
    print(n = nrow(.))
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` regrouping output by 'louvain' (override with `.groups` argument)
## # A tibble: 8 x 5
## # Groups:   louvain [8]
##   louvain    EPI    ICM   HYP    TE
##   <fct>    <dbl>  <dbl> <dbl> <dbl>
## 1 0       1      0      0     0    
## 2 1       0.0575 0.172  0.287 0.483
## 3 2       0.0233 0      0     0.977
## 4 3       0.0417 0      0     0.958
## 5 4       0.0139 0.0139 0     0.972
## 6 5       0.0652 0      0     0.935
## 7 6       1      0      0     0    
## 8 7       0.0270 0.973  0     0
prepare_cluster_composition(
    embedding = embedding,
    x = louvain, group = cell_type2
) %>%
    arrange(louvain) %>%
    plot_barplot(x = louvain, y = percentage, z = cell_type2) +
    scale_fill_manual(
        values = as.character(yarrr::piratepal(palette = "google"))
    )
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` regrouping output by 'louvain' (override with `.groups` argument)

Expression

t-SNE embedding

FEATURES_SELECTED <- c(
    "NANOG",
    "POU5F1",
    "PDGFRA",
    "GATA6",
    "GATA3",
    "GATA2"
)

FEATURES_SELECTED <- rownames(matrix_readcount_use)[
    gene_symbo_info$X2 %in% FEATURES_SELECTED
]
map(FEATURES_SELECTED, function(x) {
    plot_embedding_value(
        embedding = embedding[, c("x_tsne", "y_tsne")],
        color_values = matrix_cpm_use[x, embedding$cell],
        colorbar_position = c(0.86, 0.28),
        label = str_c("t-SNE; ", x),
        label_position = NULL,
        # label_position = c(label_x, label_y),
        geom_point_size = 1,
        sort_values = TRUE,
        FUN = NULL
    )
}) %>%
    purrr::reduce(`+`) +
    plot_annotation(theme = theme(plot.margin = margin()))

Heatmap

FEATURES_SELECTED <- c(
    "GAPDH",
    "PPIA",
    # "OCT4",
    "POU5F1",
    "NANOG",
    "SOX2",
    "PRDM14",
    "DPPA3",
    "GDF3",
    "CDH1",
    "CDH2",
    "GATA6",
    "PDGFRA",
    "GATA4",
    "SOX17",
    "DUSP4",
    "TFAP2C",
    # "CK7",
    "KRT7",
    "GATA2",
    "CDX2",
    "TEAD4",
    "EOMES",
    "TCEAL4",
    "CSH1",
    "HLA-G",
    "MMP2",
    "TBXT"
)

FEATURES_SELECTED <- rownames(matrix_readcount_use)[
    gene_symbo_info$X2 %in% FEATURES_SELECTED
]
length(FEATURES_SELECTED)
## [1] 26
matrix_heatmap <- calc_cpm(m = matrix_cpm_use)[FEATURES_SELECTED, ]
matrix_heatmap <- log10(matrix_heatmap + 1)
matrix_heatmap <- t(scale(t(matrix_heatmap)))
rownames(matrix_heatmap) <- str_remove(
    string = rownames(matrix_heatmap),
    pattern = "^E.+_"
)

(heatmap_limits <- quantile(matrix_heatmap, c(0.05, 0.95)))
##        5%       95% 
## -1.243100  1.825677
matrix_heatmap[matrix_heatmap < heatmap_limits[1]] <- heatmap_limits[1]
matrix_heatmap[matrix_heatmap > heatmap_limits[2]] <- heatmap_limits[2]
ha_columns <- ComplexHeatmap::HeatmapAnnotation(
    cell_type = ComplexHeatmap::anno_simple(
        embedding[match(
            x = colnames(matrix_heatmap),
            table = embedding$cell
        ), "cell_type"],
        # pch = anno_labels_cluster,
        col = setNames(
            object = ggthemes::tableau_color_pal("Tableau 10")(
                length(unique(embedding$cell_type))
            ),
            nm = sort(unique(embedding$cell_type))
        ),
        which = "column",
        pt_size = unit(2, "mm"),
        pt_gp = grid::gpar(
            fontfamily = "Arial",
            fontsize = 5
        ),
        simple_anno_size = unit(3, "mm")
    ),
    #
    cell_type_merged = ComplexHeatmap::anno_simple(
        embedding[match(
            x = colnames(matrix_heatmap),
            table = embedding$cell
        ), "cell_type2"],
        # pch = anno_labels_cluster,
        col = setNames(
            object = as.character(yarrr::piratepal(palette = "google")),
            nm = sort(unique(embedding$cell_type2))
        ),
        which = "column",
        pt_size = unit(2, "mm"),
        pt_gp = grid::gpar(
            fontfamily = "Arial",
            fontsize = 5
        ),
        simple_anno_size = unit(3, "mm")
    ),
    #
    develpmental_stage = ComplexHeatmap::anno_simple(
        embedding[match(
            x = colnames(matrix_heatmap),
            table = embedding$cell
        ), "develpmental_stage"],
        # pch = anno_labels_lineage,
        col = setNames(
            object = ggthemes::tableau_color_pal("Tableau 20")(
                length(unique(embedding$develpmental_stage))
            ),
            nm = levels(embedding$develpmental_stage)
        ),
        which = "column",
        # pt_size = unit(2, "mm"),
        pt_gp = grid::gpar(
            fontfamily = "Arial",
            fontsize = 5
        ),
        simple_anno_size = unit(3, "mm")
    ),
    show_annotation_name = TRUE,
    annotation_label = c(
        "Cell type",
        "Cell type, merged",
        "Develpmental stage"
    ),
    annotation_name_gp = grid::gpar(fontfamily = "Arial", fontsize = 6),
    annotation_name_side = "left"
)
ht <- ComplexHeatmap::Heatmap(
    matrix = matrix_heatmap,
    col = wesanderson::wes_palette("Zissou1", 50, type = "continuous"),
    # col =  viridis::plasma(n = 10),
    #
    cluster_rows = TRUE,
    cluster_columns = TRUE,
    #
    show_row_names = TRUE,
    show_column_names = FALSE,
    row_names_gp = grid::gpar(fontfamily = "Arial", fontsize = 6),
    #
    show_row_dend = TRUE,
    show_column_dend = TRUE,
    column_dend_side = c("bottom"),
    #
    show_heatmap_legend = TRUE,
    top_annotation = ha_columns,
    #
    heatmap_legend_param = list(
        title = "Z score",
        title_gp = grid::gpar(
            fontfamily = "Arial",
            fontsize = 6
        ),
        legend_direction = "vertical",
        labels_gp = grid::gpar(
            fontfamily = "Arial",
            fontsize = 6
        ),
        legend_height = unit(25, "mm"),
        legend_width = unit(10, "mm")
    )
)
lgd_cell_type <- ComplexHeatmap::Legend(
    title = "Cell type",
    labels = sort(unique(embedding$cell_type)),
    legend_gp = grid::gpar(fill = ggthemes::tableau_color_pal("Tableau 10")(
        length(unique(embedding$cell_type))
    )),
    labels_gp = grid::gpar(
        fontfamily = "Arial",
        fontsize = 6
    ),
    title_gp = grid::gpar(
        fontfamily = "Arial",
        fontsize = 6
    )
)

lgd_cell_type_merged <- ComplexHeatmap::Legend(
    title = "Cell type, merged",
    labels = sort(unique(embedding$cell_type2)),
    legend_gp = grid::gpar(
        fill = as.character(yarrr::piratepal(palette = "google"))
    ),
    labels_gp = grid::gpar(
        fontfamily = "Arial",
        fontsize = 6
    ),
    title_gp = grid::gpar(
        fontfamily = "Arial",
        fontsize = 6
    )
)

lgd_develpmental_stage <- ComplexHeatmap::Legend(
    title = "Develpmental stage",
    labels = levels(embedding$develpmental_stage),
    legend_gp = grid::gpar(fill = ggthemes::tableau_color_pal("Tableau 20")(
        length(levels(embedding$develpmental_stage))
    )),
    labels_gp = grid::gpar(
        fontfamily = "Arial",
        fontsize = 6
    ),
    title_gp = grid::gpar(
        fontfamily = "Arial",
        fontsize = 6
    )
)


if (FALSE) {
    ComplexHeatmap::draw(
        ht,
        heatmap_legend_list = list(
            lgd_cell_type,
            lgd_cell_type_merged,
            lgd_develpmental_stage
        )
    )
}
pd <- ComplexHeatmap::packLegend(
    lgd_cell_type,
    lgd_cell_type_merged,
    gap = unit(8, "mm"),
    direction = "horizontal"
)
ComplexHeatmap::draw(
    ht,
    heatmap_legend_list = list(pd, lgd_develpmental_stage)
)

Delineating lineage by transcriptome

Cell types and developmental stages

p_embedding_cluster_cell_type <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$cell_type %>% factor(),
    label = "t-SNE; Cell type",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = ggthemes::tableau_color_pal("Tableau 10")(
            length(unique(embedding$cell_type))
        )
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank()
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
p_embedding_cluster_cell_type2 <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$cell_type2 %>% factor(),
    label = "t-SNE; Cell type, merged",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = as.character(yarrr::piratepal(palette = "google"))
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank()
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
p_embedding_cluster_develpmental_stage <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$develpmental_stage %>% factor(),
    label = "t-SNE; Develpmental stage",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = ggthemes::tableau_color_pal("Tableau 20")(
            length(unique(embedding$develpmental_stage))
        )
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank()
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
p_embedding_cluster2 <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$louvain %>% factor(),
    label = "t-SNE; Cluster",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain)))
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank()
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
list(
    p_embedding_cluster2,
    p_embedding_cluster_cell_type,
    p_embedding_cluster_cell_type2,
    p_embedding_cluster_develpmental_stage
) %>%
    purrr::reduce(`+`) +
    plot_annotation(theme = theme(plot.margin = margin())) +
    plot_layout(guides = "collect")

AME–EPI separation

# match sample ids
# https://www.ncbi.nlm.nih.gov/geo/browse/?view=samples&series=136447
sample_info <- read_csv(
    file = "sample.csv"
)
## Parsed with column specification:
## cols(
##   Accession = col_character(),
##   Title = col_character(),
##   `Sample Type` = col_character(),
##   Taxonomy = col_character(),
##   Channels = col_double(),
##   Platform = col_character(),
##   Series = col_character(),
##   `Supplementary Types` = col_character(),
##   `Supplementary Links` = col_character(),
##   `SRA Accession` = col_character(),
##   Contact = col_character(),
##   `Release Date` = col_character()
## )
sample_info %>% head()
embedding %<>%
    left_join(
        sample_info[, c("Accession", "Title")],
        by = c("sample_name" = "Accession")
    ) %>%
    rename(sample_id = Title)

embedding %>% head()
# Table S8.1 Basic information of 555 single cells. The Embryo ID column listed the embryos to which the cells belong. The number after D is day post-fertilization; the remaining part is the serial number of embryos on the same days. The group column listed the major lineages of the cells as defined in Fig 2b.
table_s8_1 <- tibble::tribble(
    ~sample_id, ~day, ~embryo_id, ~group,
    "D6A1S1", "D6", "D6A1", "ICM",
    "D6A1S2", "D6", "D6A1", "EPI",
    "D6A1S3", "D6", "D6A1", "ICM",
    "D6A1S4", "D6", "D6A1", "ICM",
    "D6A1B1", "D6", "D6A1", "ICM",
    "D6A1B2", "D6", "D6A1", "ICM",
    "D6A2S6", "D6", "D6A2", "ICM",
    "D6A2S7", "D6", "D6A2", "ICM",
    "D6A2S8", "D6", "D6A2", "ICM",
    "D6A2B1", "D6", "D6A2", "ICM",
    "D6A2B2", "D6", "D6A2", "EPI",
    "D6A2B4", "D6", "D6A2", "ICM",
    "D6A3S1", "D6", "D6A3", "ICM",
    "D6A3S3", "D6", "D6A3", "PrE",
    "D6A3S4", "D6", "D6A3", "EPI",
    "D6A3S5", "D6", "D6A3", "ICM",
    "D6A3B1", "D6", "D6A3", "ICM",
    "D6A3B2", "D6", "D6A3", "ICM",
    "D6A4S4", "D6", "D6A4", "ICM",
    "D6A4S5", "D6", "D6A4", "ICM",
    "D6A4S6", "D6", "D6A4", "ICM",
    "D6A4S7", "D6", "D6A4", "ICM",
    "D6A4B3", "D6", "D6A4", "ICM",
    "D6A4B4", "D6", "D6A4", "ICM",
    "D6A5S1", "D6", "D6A5", "ICM",
    "D6A5S7", "D6", "D6A5", "ICM",
    "D6A5S8", "D6", "D6A5", "EPI",
    "D6A5B3", "D6", "D6A5", "ICM",
    "D6A5B4", "D6", "D6A5", "ICM",
    "D6N1B23", "D6", "D6N1", "ICM",
    "D6N1B6", "D6", "D6N1", "ICM",
    "D6N1S15", "D6", "D6N1", "EPI",
    "D6N1S1", "D6", "D6N1", "EPI",
    "D6N1S19", "D6", "D6N1", "ICM",
    "D6N1S33", "D6", "D6N1", "EPI",
    "D6N1S34", "D6", "D6N1", "EPI",
    "D6N1S35", "D6", "D6N1", "ICM",
    "D6N1S3", "D6", "D6N1", "EPI",
    "D6N1S39", "D6", "D6N1", "PrE",
    "D6N1S42", "D6", "D6N1", "EPI",
    "D6N1S4", "D6", "D6N1", "EPI",
    "D6N1S9", "D6", "D6N1", "EPI",
    "D6N2B11", "D6", "D6N2", "ICM",
    "D6N2B12", "D6", "D6N2", "ICM",
    "D6N2B1", "D6", "D6N2", "EPI",
    "D6N2B18", "D6", "D6N2", "EPI",
    "D6N2B2", "D6", "D6N2", "EPI",
    "D6N2B28", "D6", "D6N2", "ICM",
    "D6N2B7", "D6", "D6N2", "ICM",
    "D6N2B8", "D6", "D6N2", "EPI",
    "D6N2S11", "D6", "D6N2", "EPI",
    "D6N2S2", "D6", "D6N2", "EPI",
    "D6N2S35", "D6", "D6N2", "EPI",
    "D6N3B12", "D6", "D6N3", "EPI",
    "D6N3B7", "D6", "D6N3", "EPI",
    "D6N3S11", "D6", "D6N3", "EPI",
    "D6N3S22", "D6", "D6N3", "EPI",
    "D6N3S2", "D6", "D6N3", "EPI",
    "D6N3S28", "D6", "D6N3", "EPI",
    "D6N3S35", "D6", "D6N3", "EPI",
    "D6N3S40", "D6", "D6N3", "EPI",
    "D6N3S51", "D6", "D6N3", "EPI",
    "D7A1B1", "D7", "D7A1", "ICM",
    "D7A1B3", "D7", "D7A1", "ICM",
    "D7A1B5", "D7", "D7A1", "CTB",
    "D7A1B7", "D7", "D7A1", "ICM",
    "D7A1B8", "D7", "D7A1", "ICM",
    "D7A1S11", "D7", "D7A1", "CTB",
    "D7A1S13", "D7", "D7A1", "EPI",
    "D7A1S14", "D7", "D7A1", "ICM",
    "D7A1S15", "D7", "D7A1", "ICM",
    "D7A1S16", "D7", "D7A1", "EPI",
    "D7A1S1", "D7", "D7A1", "ICM",
    "D7A1S5", "D7", "D7A1", "ICM",
    "D7A1S6", "D7", "D7A1", "ICM",
    "D7A1S7", "D7", "D7A1", "CTB",
    "D7A1S8", "D7", "D7A1", "PrE",
    "D7A1S9", "D7", "D7A1", "CTB",
    "D7A2B1", "D7", "D7A2", "ICM",
    "D7A2B4", "D7", "D7A2", "ICM",
    "D7A2B5", "D7", "D7A2", "ICM",
    "D7A2B6", "D7", "D7A2", "CTB",
    "D7A2B8", "D7", "D7A2", "CTB",
    "D7A2S10", "D7", "D7A2", "CTB",
    "D7A2S14", "D7", "D7A2", "ICM",
    "D7A2S16", "D7", "D7A2", "CTB",
    "D7A2S1", "D7", "D7A2", "ICM",
    "D7A2S2", "D7", "D7A2", "ICM",
    "D7A2S3", "D7", "D7A2", "ICM",
    "D7A2S6", "D7", "D7A2", "CTB",
    "D7A3B10", "D7", "D7A3", "CTB",
    "D7A3B1", "D7", "D7A3", "CTB",
    "D7A3B3", "D7", "D7A3", "CTB",
    "D7A3B8", "D7", "D7A3", "EPI",
    "D7A3S10", "D7", "D7A3", "CTB",
    "D7A3S12", "D7", "D7A3", "CTB",
    "D7A3S14", "D7", "D7A3", "CTB",
    "D7A3S1", "D7", "D7A3", "CTB",
    "D7A3S3", "D7", "D7A3", "CTB",
    "D7A3S4", "D7", "D7A3", "CTB",
    "D7A3S5", "D7", "D7A3", "CTB",
    "D7A3S8", "D7", "D7A3", "EPI",
    "D7A4B2", "D7", "D7A4", "PrE",
    "D7A4B3", "D7", "D7A4", "CTB",
    "D7A4B5", "D7", "D7A4", "CTB",
    "D7A4B6", "D7", "D7A4", "CTB",
    "D7A4B8", "D7", "D7A4", "CTB",
    "D7A4S12", "D7", "D7A4", "PrE",
    "D7A4S13", "D7", "D7A4", "CTB",
    "D7A4S14", "D7", "D7A4", "CTB",
    "D7A4S15", "D7", "D7A4", "CTB",
    "D7A4S1", "D7", "D7A4", "CTB",
    "D7A4S2", "D7", "D7A4", "PrE",
    "D7A4S7", "D7", "D7A4", "PrE",
    "D7N1B1", "D7", "D7N1", "EPI",
    "D7N1S7", "D7", "D7N1", "EPI",
    "D7N1S9", "D7", "D7N1", "EPI",
    "D7N1B5", "D7", "D7N1", "ICM",
    "D7N1B7", "D7", "D7N1", "EPI",
    "D7N1B9", "D7", "D7N1", "EPI",
    "D7N1S15", "D7", "D7N1", "EPI",
    "D7N1S18", "D7", "D7N1", "ICM",
    "D7N1S19", "D7", "D7N1", "EPI",
    "D7N1S21", "D7", "D7N1", "EPI",
    "D7N1S24", "D7", "D7N1", "EPI",
    "D7N1S27", "D7", "D7N1", "EPI",
    "D7N1S30", "D7", "D7N1", "EPI",
    "D8_8B1", "D8", "D8_8", "EPI",
    "D8_8B2", "D8", "D8_8", "CTB",
    "D8_8B3", "D8", "D8_8", "PrE",
    "D8_8B4", "D8", "D8_8", "CTB",
    "D8_8S1", "D8", "D8_8", "CTB",
    "D8_8S2", "D8", "D8_8", "EPI",
    "D8_8S3", "D8", "D8_8", "CTB",
    "D8_8S4", "D8", "D8_8", "CTB",
    "D8_8S5", "D8", "D8_8", "CTB",
    "D8_8S6", "D8", "D8_8", "CTB",
    "D8_8S7", "D8", "D8_8", "CTB",
    "D8_8S8", "D8", "D8_8", "CTB",
    "D8A1B10", "D8", "D8A1", "STB",
    "D8A1B2", "D8", "D8A1", "CTB",
    "D8A1B3", "D8", "D8A1", "CTB",
    "D8A1B4", "D8", "D8A1", "STB",
    "D8A1B6", "D8", "D8A1", "CTB",
    "D8A1S11", "D8", "D8A1", "EPI",
    "D8A1S1", "D8", "D8A1", "CTB",
    "D8A1S24", "D8", "D8A1", "EPI",
    "D8A1S31", "D8", "D8A1", "EPI",
    "D8A1S3", "D8", "D8A1", "CTB",
    "D8A1S7", "D8", "D8A1", "CTB",
    "D8A1S8", "D8", "D8A1", "EPI",
    "D8A2B1", "D8", "D8A2", "STB",
    "D8A2B2", "D8", "D8A2", "CTB",
    "D8A2B5", "D8", "D8A2", "STB",
    "D8A2S10", "D8", "D8A2", "EPI",
    "D8A2S12", "D8", "D8A2", "CTB",
    "D8A2S15", "D8", "D8A2", "EPI",
    "D8A2S1", "D8", "D8A2", "STB",
    "D8A2S24", "D8", "D8A2", "CTB",
    "D8A2S29", "D8", "D8A2", "EPI",
    "D8A2S2", "D8", "D8A2", "EPI",
    "D8A2S3", "D8", "D8A2", "CTB",
    "D8A2S4", "D8", "D8A2", "CTB",
    "D8A3B10", "D8", "D8A3", "STB",
    "D8A3B11", "D8", "D8A3", "PrE",
    "D8A3B1", "D8", "D8A3", "STB",
    "D8A3B4", "D8", "D8A3", "STB",
    "D8A3S12", "D8", "D8A3", "CTB",
    "D8A3S13", "D8", "D8A3", "STB",
    "D8A3S1", "D8", "D8A3", "STB",
    "D8A3S28", "D8", "D8A3", "STB",
    "D8A3S2", "D8", "D8A3", "CTB",
    "D8A3S5", "D8", "D8A3", "STB",
    "D8A3S7", "D8", "D8A3", "CTB",
    "D8A3S8", "D8", "D8A3", "STB",
    "D8A5B7", "D8", "D8A5", "CTB",
    "D8A5B8", "D8", "D8A5", "CTB",
    "D8A5S14", "D8", "D8A5", "CTB",
    "D8A5S1", "D8", "D8A5", "CTB",
    "D8A5S4", "D8", "D8A5", "CTB",
    "D8A6B1", "D8", "D8A6", "CTB",
    "D8A6B3", "D8", "D8A6", "CTB",
    "D8A6B6", "D8", "D8A6", "CTB",
    "D8A6S15", "D8", "D8A6", "CTB",
    "D8A6S5", "D8", "D8A6", "CTB",
    "D8A6S7", "D8", "D8A6", "EPI",
    "D9A1B1", "D9", "D9A1", "CTB",
    "D9A1B15", "D9", "D9A1", "STB",
    "D9A1B16", "D9", "D9A1", "CTB",
    "D9A1B2", "D9", "D9A1", "STB",
    "D9A1B3", "D9", "D9A1", "CTB",
    "D9A1B4", "D9", "D9A1", "STB",
    "D9A1S1", "D9", "D9A1", "STB",
    "D9A1S10", "D9", "D9A1", "EPI",
    "D9A1S2", "D9", "D9A1", "CTB",
    "D9A1S23", "D9", "D9A1", "CTB",
    "D9A1S26", "D9", "D9A1", "CTB",
    "D9A1S28", "D9", "D9A1", "EPI",
    "D9A1S3", "D9", "D9A1", "CTB",
    "D9A1S7", "D9", "D9A1", "CTB",
    "D9A1S8", "D9", "D9A1", "CTB",
    "D9A2B1", "D9", "D9A2", "STB",
    "D9A2B2", "D9", "D9A2", "STB",
    "D9A2B3", "D9", "D9A2", "CTB",
    "D9A2B5", "D9", "D9A2", "CTB",
    "D9A2B8", "D9", "D9A2", "CTB",
    "D9A2S1", "D9", "D9A2", "CTB",
    "D9A2S2", "D9", "D9A2", "CTB",
    "D9A2S3", "D9", "D9A2", "CTB",
    "D9A2S4", "D9", "D9A2", "CTB",
    "D9A2S6", "D9", "D9A2", "PrE",
    "D9A3B1", "D9", "D9A3", "CTB",
    "D9A3B2", "D9", "D9A3", "STB",
    "D9A3B3", "D9", "D9A3", "STB",
    "D9A3B4", "D9", "D9A3", "STB",
    "D9A3B7", "D9", "D9A3", "CTB",
    "D9A3S1", "D9", "D9A3", "CTB",
    "D9A3S11", "D9", "D9A3", "STB",
    "D9A3S14", "D9", "D9A3", "EPI",
    "D9A3S15", "D9", "D9A3", "STB",
    "D9A3S2", "D9", "D9A3", "CTB",
    "D9A3S3", "D9", "D9A3", "CTB",
    "D9A4B2", "D9", "D9A4", "CTB",
    "D9A4B4", "D9", "D9A4", "CTB",
    "D9A4B7", "D9", "D9A4", "CTB",
    "D9A4B8", "D9", "D9A4", "CTB",
    "D9A4S1", "D9", "D9A4", "EPI",
    "D9A4S10", "D9", "D9A4", "CTB",
    "D9A4S11", "D9", "D9A4", "CTB",
    "D9A4S6", "D9", "D9A4", "CTB",
    "D9A4S7", "D9", "D9A4", "CTB",
    "D9A4S9", "D9", "D9A4", "CTB",
    "D9A5B5", "D9", "D9A5", "CTB",
    "D9A5S12", "D9", "D9A5", "EPI",
    "D9A5S3", "D9", "D9A5", "CTB",
    "D9A5S6", "D9", "D9A5", "STB",
    "D9A5S8", "D9", "D9A5", "CTB",
    "D9A5S9", "D9", "D9A5", "EPI",
    "D9A6B1", "D9", "D9A6", "STB",
    "D9A6B6", "D9", "D9A6", "CTB",
    "D9A6B8", "D9", "D9A6", "CTB",
    "D9A6S10", "D9", "D9A6", "CTB",
    "D9A6S14", "D9", "D9A6", "CTB",
    "D9A6S15", "D9", "D9A6", "CTB",
    "D9A6S5", "D9", "D9A6", "CTB",
    "D9A6S9", "D9", "D9A6", "PrE",
    "D9A4B1", "D9", "D9A4", "PrE",
    "D9A4S14", "D9", "D9A4", "ICM",
    "D9A4S16", "D9", "D9A4", "EPI",
    "D9A4S3", "D9", "D9A4", "EPI",
    "D9A4S4", "D9", "D9A4", "ICM",
    "D9A4S5", "D9", "D9A4", "EPI",
    "D9A5S10", "D9", "D9A5", "CTB",
    "D9A5S11", "D9", "D9A5", "EPI",
    "D10A4S4", "D10", "D10A4", "STB",
    "D10A1B11", "D10", "D10A1", "STB",
    "D10A1B17", "D10", "D10A1", "CTB",
    "D10A1B1", "D10", "D10A1", "STB",
    "D10A1B2", "D10", "D10A1", "STB",
    "D10A1B3", "D10", "D10A1", "STB",
    "D10A1B4", "D10", "D10A1", "STB",
    "D10A1B5", "D10", "D10A1", "STB",
    "D10A1B7", "D10", "D10A1", "STB",
    "D10A1B8", "D10", "D10A1", "STB",
    "D10A1S10", "D10", "D10A1", "CTB",
    "D10A1S11", "D10", "D10A1", "CTB",
    "D10A1S12", "D10", "D10A1", "CTB",
    "D10A1S13", "D10", "D10A1", "STB",
    "D10A1S1", "D10", "D10A1", "CTB",
    "D10A1S21", "D10", "D10A1", "EPI",
    "D10A1S23", "D10", "D10A1", "EPI",
    "D10A1S2", "D10", "D10A1", "STB",
    "D10A1S31", "D10", "D10A1", "EPI",
    "D10A1S32", "D10", "D10A1", "EPI",
    "D10A1S34", "D10", "D10A1", "EPI",
    "D10A1S3", "D10", "D10A1", "CTB",
    "D10A1S40", "D10", "D10A1", "EPI",
    "D10A1S4", "D10", "D10A1", "STB",
    "D10A1S6", "D10", "D10A1", "EPI",
    "D10A1S7", "D10", "D10A1", "CTB",
    "D10A1S9", "D10", "D10A1", "CTB",
    "D10A2B1", "D10", "D10A2", "STB",
    "D10A2B2", "D10", "D10A2", "CTB",
    "D10A2B3", "D10", "D10A2", "STB",
    "D10A2B4", "D10", "D10A2", "STB",
    "D10A2B6", "D10", "D10A2", "STB",
    "D10A2S17", "D10", "D10A2", "EPI",
    "D10A2S1", "D10", "D10A2", "CTB",
    "D10A2S21", "D10", "D10A2", "CTB",
    "D10A2S24", "D10", "D10A2", "PrE",
    "D10A2S2", "D10", "D10A2", "STB",
    "D10A2S32", "D10", "D10A2", "EPI",
    "D10A2S3", "D10", "D10A2", "EPI",
    "D10A3B17", "D10", "D10A3", "CTB",
    "D10A3B2", "D10", "D10A3", "CTB",
    "D10A3B3", "D10", "D10A3", "STB",
    "D10A3B4", "D10", "D10A3", "CTB",
    "D10A3B5", "D10", "D10A3", "CTB",
    "D10A3B6", "D10", "D10A3", "STB",
    "D10A3B7", "D10", "D10A3", "CTB",
    "D10A3B8", "D10", "D10A3", "STB",
    "D10A3B9", "D10", "D10A3", "CTB",
    "D10A3S10", "D10", "D10A3", "STB",
    "D10A3S18", "D10", "D10A3", "STB",
    "D10A3S1", "D10", "D10A3", "CTB",
    "D10A3S2", "D10", "D10A3", "CTB",
    "D10A3S35", "D10", "D10A3", "CTB",
    "D10A3S7", "D10", "D10A3", "CTB",
    "D10A3S9", "D10", "D10A3", "CTB",
    "D10A4B3", "D10", "D10A4", "CTB",
    "D10A4B7", "D10", "D10A4", "STB",
    "D10A4B8", "D10", "D10A4", "STB",
    "D10A4S11", "D10", "D10A4", "STB",
    "D10A4S14", "D10", "D10A4", "CTB",
    "D10A4S16", "D10", "D10A4", "CTB",
    "D10A4S7", "D10", "D10A4", "CTB",
    "D10A4S8", "D10", "D10A4", "STB",
    "D10A4S9", "D10", "D10A4", "CTB",
    "D10A5B1", "D10", "D10A5", "STB",
    "D10A5B3", "D10", "D10A5", "STB",
    "D10A5B8", "D10", "D10A5", "STB",
    "D10A5S12", "D10", "D10A5", "CTB",
    "D10A5S16", "D10", "D10A5", "STB",
    "D10A5S3", "D10", "D10A5", "CTB",
    "D10A6S10", "D10", "D10A6", "CTB",
    "D10A6S14", "D10", "D10A6", "PrE",
    "D10A6S1", "D10", "D10A6", "PrE",
    "D10A6S4", "D10", "D10A6", "EPI",
    "D10A6S5", "D10", "D10A6", "EPI",
    "D10A6S7", "D10", "D10A6", "EPI",
    "D10A6S8", "D10", "D10A6", "EPI",
    "D12A3B10", "D12", "D12A3", "STB",
    "D12A3B11", "D12", "D12A3", "STB",
    "D12A3B12", "D12", "D12A3", "STB",
    "D12A3B13", "D12", "D12A3", "STB",
    "D12A3B14", "D12", "D12A3", "EPI",
    "D12A3B15", "D12", "D12A3", "STB",
    "D12A3B16", "D12", "D12A3", "STB",
    "D12A3B1", "D12", "D12A3", "PrE",
    "D12A3B2", "D12", "D12A3", "STB",
    "D12A3B3", "D12", "D12A3", "STB",
    "D12A3B4", "D12", "D12A3", "CTB",
    "D12A3B5", "D12", "D12A3", "STB",
    "D12A3B6", "D12", "D12A3", "STB",
    "D12A3B7", "D12", "D12A3", "STB",
    "D12A3B8", "D12", "D12A3", "STB",
    "D12A3B9", "D12", "D12A3", "STB",
    "D12A3S10", "D12", "D12A3", "EPI",
    "D12A3S11", "D12", "D12A3", "CTB",
    "D12A3S12", "D12", "D12A3", "CTB",
    "D12A3S13", "D12", "D12A3", "EPI",
    "D12A3S14", "D12", "D12A3", "STB",
    "D12A3S15", "D12", "D12A3", "EPI",
    "D12A3S16", "D12", "D12A3", "EPI",
    "D12A3S17", "D12", "D12A3", "CTB",
    "D12A3S18", "D12", "D12A3", "CTB",
    "D12A3S19", "D12", "D12A3", "CTB",
    "D12A3S1", "D12", "D12A3", "STB",
    "D12A3S20", "D12", "D12A3", "CTB",
    "D12A3S21", "D12", "D12A3", "CTB",
    "D12A3S22", "D12", "D12A3", "STB",
    "D12A3S23", "D12", "D12A3", "EPI",
    "D12A3S24", "D12", "D12A3", "EPI",
    "D12A3S25", "D12", "D12A3", "CTB",
    "D12A3S26", "D12", "D12A3", "EPI",
    "D12A3S27", "D12", "D12A3", "EPI",
    "D12A3S28", "D12", "D12A3", "CTB",
    "D12A3S29", "D12", "D12A3", "STB",
    "D12A3S2", "D12", "D12A3", "EPI",
    "D12A3S30", "D12", "D12A3", "STB",
    "D12A3S31", "D12", "D12A3", "CTB",
    "D12A3S32", "D12", "D12A3", "EPI",
    "D12A3S3", "D12", "D12A3", "EPI",
    "D12A3S4", "D12", "D12A3", "CTB",
    "D12A3S5", "D12", "D12A3", "CTB",
    "D12A3S6", "D12", "D12A3", "CTB",
    "D12A3S7", "D12", "D12A3", "STB",
    "D12A3S8", "D12", "D12A3", "CTB",
    "D12A3S9", "D12", "D12A3", "CTB",
    "D12A4B15", "D12", "D12A4", "STB",
    "D12A4B16", "D12", "D12A4", "STB",
    "D12A4B5", "D12", "D12A4", "STB",
    "D12A4B8", "D12", "D12A4", "STB",
    "D12A4B9", "D12", "D12A4", "STB",
    "D12A4S12", "D12", "D12A4", "CTB",
    "D12A4S16", "D12", "D12A4", "CTB",
    "D12A4S17", "D12", "D12A4", "CTB",
    "D12A4S21", "D12", "D12A4", "STB",
    "D12A4S22", "D12", "D12A4", "EPI",
    "D12A4S26", "D12", "D12A4", "EPI",
    "D12A4S29", "D12", "D12A4", "EPI",
    "D12A4S2", "D12", "D12A4", "CTB",
    "D12A4S30", "D12", "D12A4", "EPI",
    "D12A4S7", "D12", "D12A4", "EPI",
    "D12A4S9", "D12", "D12A4", "CTB",
    "D12A5B11", "D12", "D12A5", "PrE",
    "D12A5B15", "D12", "D12A5", "STB",
    "D12A5B5", "D12", "D12A5", "EVT",
    "D12A5B6", "D12", "D12A5", "CTB",
    "D12A5B9", "D12", "D12A5", "STB",
    "D12A5S13", "D12", "D12A5", "CTB",
    "D12A5S16", "D12", "D12A5", "EPI",
    "D12A5S17", "D12", "D12A5", "PrE",
    "D12A5S18", "D12", "D12A5", "CTB",
    "D12A5S19", "D12", "D12A5", "EPI",
    "D12A5S1", "D12", "D12A5", "PrE",
    "D12A5S20", "D12", "D12A5", "PrE",
    "D12A5S24", "D12", "D12A5", "PrE",
    "D12A5S25", "D12", "D12A5", "PrE",
    "D12A5S30", "D12", "D12A5", "PrE",
    "D12A5S4", "D12", "D12A5", "PrE",
    "D12A5S5", "D12", "D12A5", "EPI",
    "D12A5S6", "D12", "D12A5", "EPI",
    "D12_1B3", "D12", "D12_1", "EVT",
    "D12_1B4", "D12", "D12_1", "STB",
    "D12_2B2", "D12", "D12_2", "EVT",
    "D12_2B9", "D12", "D12_2", "EVT",
    "D12_2S1", "D12", "D12_2", "STB",
    "D12A4S27", "D12", "D12A4", "EPI",
    "D14_1B1", "D14", "D14_1", "EVT",
    "D14_1B2", "D14", "D14_1", "STB",
    "D14_1B5", "D14", "D14_1", "EVT",
    "D14_1S10", "D14", "D14_1", "STB",
    "D14_1S2", "D14", "D14_1", "EVT",
    "D14_2S1", "D14", "D14_2", "EVT",
    "D14_3B5", "D14", "D14_3", "EVT",
    "D14_3B6", "D14", "D14_3", "EVT",
    "D14_3S10", "D14", "D14_3", "EPI",
    "D14_3S15", "D14", "D14_3", "EPI",
    "D14_3S16", "D14", "D14_3", "EPI",
    "D14_3S9", "D14", "D14_3", "CTB",
    "D14_2S2", "D14", "D14_2", "STB",
    "D14_2B1", "D14", "D14_2", "EVT",
    "D14_2B3", "D14", "D14_2", "EVT",
    "D14A1B10", "D14", "D14A1", "STB",
    "D14A1B11", "D14", "D14A1", "PSA-EPI",
    "D14A1B12", "D14", "D14A1", "STB",
    "D14A1B13", "D14", "D14A1", "PSA-EPI",
    "D14A1B14", "D14", "D14A1", "PSA-EPI",
    "D14A1B15", "D14", "D14A1", "PSA-EPI",
    "D14A1B16", "D14", "D14A1", "PSA-EPI",
    "D14A1B17", "D14", "D14A1", "EVT",
    "D14A1B18", "D14", "D14A1", "STB",
    "D14A1B19", "D14", "D14A1", "EVT",
    "D14A1B1", "D14", "D14A1", "PSA-EPI",
    "D14A1B20", "D14", "D14A1", "STB",
    "D14A1B21", "D14", "D14A1", "PrE",
    "D14A1B22", "D14", "D14A1", "STB",
    "D14A1B23", "D14", "D14A1", "STB",
    "D14A1B24", "D14", "D14A1", "STB",
    "D14A1B25", "D14", "D14A1", "STB",
    "D14A1B26", "D14", "D14A1", "STB",
    "D14A1B27", "D14", "D14A1", "EPI",
    "D14A1B28", "D14", "D14A1", "EPI",
    "D14A1B2", "D14", "D14A1", "PSA-EPI",
    "D14A1B3", "D14", "D14A1", "PSA-EPI",
    "D14A1B4", "D14", "D14A1", "PSA-EPI",
    "D14A1B5", "D14", "D14A1", "PSA-EPI",
    "D14A1B6", "D14", "D14A1", "PSA-EPI",
    "D14A1B7", "D14", "D14A1", "PSA-EPI",
    "D14A1B8", "D14", "D14A1", "PSA-EPI",
    "D14A1B9", "D14", "D14A1", "PSA-EPI",
    "D14A1S10", "D14", "D14A1", "PSA-EPI",
    "D14A1S11", "D14", "D14A1", "PSA-EPI",
    "D14A1S12", "D14", "D14A1", "PSA-EPI",
    "D14A1S13", "D14", "D14A1", "PSA-EPI",
    "D14A1S14", "D14", "D14A1", "PSA-EPI",
    "D14A1S15", "D14", "D14A1", "PSA-EPI",
    "D14A1S16", "D14", "D14A1", "PSA-EPI",
    "D14A1S17", "D14", "D14A1", "PSA-EPI",
    "D14A1S18", "D14", "D14A1", "PSA-EPI",
    "D14A1S19", "D14", "D14A1", "PSA-EPI",
    "D14A1S1", "D14", "D14A1", "PSA-EPI",
    "D14A1S20", "D14", "D14A1", "EPI",
    "D14A1S21", "D14", "D14A1", "PSA-EPI",
    "D14A1S22", "D14", "D14A1", "PSA-EPI",
    "D14A1S23", "D14", "D14A1", "PSA-EPI",
    "D14A1S24", "D14", "D14A1", "PSA-EPI",
    "D14A1S25", "D14", "D14A1", "PSA-EPI",
    "D14A1S26", "D14", "D14A1", "PSA-EPI",
    "D14A1S27", "D14", "D14A1", "PSA-EPI",
    "D14A1S28", "D14", "D14A1", "PSA-EPI",
    "D14A1S29", "D14", "D14A1", "PSA-EPI",
    "D14A1S2", "D14", "D14A1", "PSA-EPI",
    "D14A1S30", "D14", "D14A1", "PSA-EPI",
    "D14A1S31", "D14", "D14A1", "PSA-EPI",
    "D14A1S32", "D14", "D14A1", "PSA-EPI",
    "D14A1S33", "D14", "D14A1", "EPI",
    "D14A1S34", "D14", "D14A1", "STB",
    "D14A1S36", "D14", "D14A1", "STB",
    "D14A1S39", "D14", "D14A1", "EPI",
    "D14A1S3", "D14", "D14A1", "PSA-EPI",
    "D14A1S41", "D14", "D14A1", "EPI",
    "D14A1S42", "D14", "D14A1", "EPI",
    "D14A1S43", "D14", "D14A1", "EPI",
    "D14A1S44", "D14", "D14A1", "STB",
    "D14A1S45", "D14", "D14A1", "EPI",
    "D14A1S46", "D14", "D14A1", "EPI",
    "D14A1S47", "D14", "D14A1", "EPI",
    "D14A1S48", "D14", "D14A1", "EPI",
    "D14A1S51", "D14", "D14A1", "EPI",
    "D14A1S53", "D14", "D14A1", "STB",
    "D14A1S56", "D14", "D14A1", "EPI",
    "D14A1S57", "D14", "D14A1", "EPI",
    "D14A1S58", "D14", "D14A1", "EPI",
    "D14A1S59", "D14", "D14A1", "EPI",
    "D14A1S5", "D14", "D14A1", "PSA-EPI",
    "D14A1S60", "D14", "D14A1", "EPI",
    "D14A1S61", "D14", "D14A1", "EPI",
    "D14A1S62", "D14", "D14A1", "EPI",
    "D14A1S63", "D14", "D14A1", "STB",
    "D14A1S64", "D14", "D14A1", "EPI",
    "D14A1S6", "D14", "D14A1", "PSA-EPI",
    "D14A1S7", "D14", "D14A1", "PSA-EPI",
    "D14A1S8", "D14", "D14A1", "PSA-EPI",
    "D14A1S9", "D14", "D14A1", "PSA-EPI",
    "D14A2B12", "D14", "D14A2", "EVT",
    "D14A2B13", "D14", "D14A2", "EVT",
    "D14A2B16", "D14", "D14A2", "STB",
    "D14A2B1", "D14", "D14A2", "EVT",
    "D14A2B2", "D14", "D14A2", "EVT",
    "D14A2B4", "D14", "D14A2", "STB",
    "D14A2B7", "D14", "D14A2", "STB",
    "D14A2B9", "D14", "D14A2", "EVT",
    "D14A2S13", "D14", "D14A2", "EVT",
    "D14A2S15", "D14", "D14A2", "CTB",
    "D14A2S17", "D14", "D14A2", "EVT",
    "D14A2S19", "D14", "D14A2", "STB",
    "D14A2S1", "D14", "D14A2", "EVT",
    "D14A2S21", "D14", "D14A2", "EVT",
    "D14A2S23", "D14", "D14A2", "EVT",
    "D14A2S27", "D14", "D14A2", "EVT",
    "D14A2S28", "D14", "D14A2", "EVT",
    "D14A2S29", "D14", "D14A2", "STB",
    "D14A2S5", "D14", "D14A2", "EVT",
    "D14A2S6", "D14", "D14A2", "EVT",
    "D14A3B10", "D14", "D14A3", "EVT",
    "D14A3B12", "D14", "D14A3", "EVT",
    "D14A3B14", "D14", "D14A3", "STB",
    "D14A3B2", "D14", "D14A3", "EVT",
    "D14A3B7", "D14", "D14A3", "EVT",
    "D14A3S14", "D14", "D14A3", "EVT",
    "D14A3S18", "D14", "D14A3", "STB",
    "D14A3S19", "D14", "D14A3", "EVT",
    "D14A3S20", "D14", "D14A3", "EPI",
    "D14A3S23", "D14", "D14A3", "EVT",
    "D14A3S25", "D14", "D14A3", "CTB",
    "D14A3S26", "D14", "D14A3", "EVT",
    "D14A3S27", "D14", "D14A3", "CTB",
    "D14A3S28", "D14", "D14A3", "EVT",
    "D14A3S29", "D14", "D14A3", "EPI",
    "D14A3S30", "D14", "D14A3", "EVT",
    "D14A3S5", "D14", "D14A3", "CTB",
    "D14A3S7", "D14", "D14A3", "EVT",
    "D14A3S8", "D14", "D14A3", "EVT"
)

Add embryo ids.

embedding %<>%
    mutate(
        sample_id = str_remove(
            string = sample_id,
            pattern = "Embryo_"
        )
    ) %>%
    left_join(table_s8_1[, c("sample_id", "embryo_id")])
## Joining, by = "sample_id"
# Table S8.3 Group information of single cells in extended data figure 4o.
# cleaned
table_s8_3 <- tibble::tribble(
    ~sample_id, ~day, ~group,
    "D12A3B14", "D12", "EPI",
    "D12A3S13", "D12", "EPI",
    "D12A3S15", "D12", "EPI",
    "D12A3S16", "D12", "EPI",
    "D12A3S2", "D12", "EPI",
    "D12A3S23", "D12", "EPI",
    "D12A3S24", "D12", "EPI",
    "D12A3S26", "D12", "EPI",
    "D12A3S27", "D12", "EPI",
    "D12A3S32", "D12", "EPI",
    "D12A4S26", "D12", "EPI",
    "D12A4S27", "D12", "EPI",
    "D12A4S30", "D12", "EPI",
    "D12A5S16", "D12", "EPI",
    "D12A5S19", "D12", "EPI",
    "D12A5S5", "D12", "EPI",
    "D12A5S6", "D12", "EPI",
    "D14A1B27", "D14", "EPI",
    "D14A1B28", "D14", "EPI",
    "D14A1S33", "D14", "EPI",
    "D14A1S41", "D14", "EPI",
    "D14A1S45", "D14", "EPI",
    "D14A1S46", "D14", "EPI",
    "D14A1S47", "D14", "EPI",
    "D14A1S48", "D14", "EPI",
    "D14A1S51", "D14", "EPI",
    "D14A1S56", "D14", "EPI",
    "D14A1S58", "D14", "EPI",
    "D14A1S61", "D14", "EPI",
    "D14A1S62", "D14", "EPI",
    "D14A1S64", "D14", "EPI",
    "D14_3S10", "D14", "EPI",
    "D14_3S15", "D14", "EPI",
    "D14_3S16", "D14", "EPI",
    "D14A1B13", "D14", "EPI",
    "D14A1B16", "D14", "EPI",
    "D14A1B2", "D14", "EPI",
    "D14A1B8", "D14", "EPI",
    "D14A1S11", "D14", "EPI",
    "D14A1S13", "D14", "EPI",
    "D14A1S14", "D14", "EPI",
    "D14A1S17", "D14", "EPI",
    "D14A1S18", "D14", "EPI",
    "D14A1S19", "D14", "EPI",
    "D14A1S20", "D14", "EPI",
    "D14A1S21", "D14", "EPI",
    "D14A1S26", "D14", "EPI",
    "D14A1S28", "D14", "EPI",
    "D14A1S30", "D14", "EPI",
    "D14A1S31", "D14", "EPI",
    "D14A1S6", "D14", "EPI",
    "D14A1S7", "D14", "EPI",
    "D14A1S9", "D14", "EPI",
    "D12A3S3", "D12", "Intermediate",
    "D12A4S29", "D12", "Intermediate",
    "D12A4S7", "D12", "Intermediate",
    "D14A1S39", "D14", "Intermediate",
    "D14A1S42", "D14", "Intermediate",
    "D14A1S43", "D14", "Intermediate",
    "D14A1S57", "D14", "Intermediate",
    "D14A1S60", "D14", "Intermediate",
    "D14A3S20", "D14", "Intermediate",
    "D14A3S29", "D14", "Intermediate",
    "D14A1B11", "D14", "Intermediate",
    "D14A1B4", "D14", "Intermediate",
    "D14A1B6", "D14", "Intermediate",
    "D14A1B9", "D14", "Intermediate",
    "D14A1S1", "D14", "Intermediate",
    "D14A1S10", "D14", "Intermediate",
    "D14A1S12", "D14", "Intermediate",
    "D14A1S2", "D14", "Intermediate",
    "D14A1S22", "D14", "Intermediate",
    "D14A1S23", "D14", "Intermediate",
    "D14A1S25", "D14", "Intermediate",
    "D14A1S29", "D14", "Intermediate",
    "D14A1S3", "D14", "Intermediate",
    "D14A1S32", "D14", "Intermediate",
    "D14A1S5", "D14", "Intermediate",
    "D14A1S8", "D14", "Intermediate",
    "D14A1B3", "D14", "AME",
    "D14A1S24", "D14", "AME",
    "D14A1S27", "D14", "AME",
    "D12A3S10", "D12", "AME",
    "D12A4S22", "D12", "AME",
    "D14A1S59", "D14", "AME",
    "D14A1B1", "D14", "AME",
    "D14A1B14", "D14", "AME",
    "D14A1B15", "D14", "AME",
    "D14A1B5", "D14", "AME",
    "D14A1B7", "D14", "AME",
    "D14A1S15", "D14", "AME",
    "D14A1S16", "D14", "AME"
)
# "D12A3B14" %in% embedding$sample_id
# "D14_3S10" %in% embedding$sample_id
# "D14A1S12" %in% embedding$sample_id

embedding2 <- embedding %>%
    left_join(
        table_s8_3[, c("sample_id", "group")],
        by = "sample_id"
    )

color_value_factors <- embedding2$group
color_value_factors[is.na(embedding2$group)] <- "N/A"
# Extended data figure 4o
plot_embedding(
    embedding = embedding2[, c("x_tsne", "y_tsne")],
    color_values = color_value_factors,
    label = "t-SNE; Cell type",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = c(
            RColorBrewer::brewer.pal(
                n = length(unique(color_value_factors)) - 1,
                name = "Dark2"
            ),
            "grey70"
        )
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank()
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

HESX1-T+ / HESX1+T- EPI

# Table S8.4 Cells used in extended data figure 5i.
embedding2 <- embedding %>%
    mutate(
        group = case_when(
            sample_id %in% c(
                "D14A1S6",
                "D14A1S28",
                "D14A1S30",
                "D14A1S7",
                "D14A1S31",
                "D14A1S13",
                "D14A1S58",
                "D14A1S47",
                "D14A1S64",
                "D14A3S20",
                "D14A1S21",
                "D14A1B27"
            ) ~ "HESX1-T+ EPI",
            sample_id %in% c(
                "D14A1S46",
                "D14A1S51",
                "D14A1B2",
                "D14A1S12",
                "D14A1S14",
                "D14A1S29",
                "D14A1S33",
                "D14A1S56",
                "D14_3S10",
                "D14_3S15"
            )
            ~ "HESX1+T- EPI"
        ),
        group = ifelse(is.na(group), "N/A", group)
    )

embedding2 %>%
    dplyr::count(group)

t-SNE embedding

# Extended data figure 4o
p_embedding_HESX1_p1 <- plot_embedding(
    embedding = embedding2[, c("x_tsne", "y_tsne")],
    color_values = embedding2$group %>% factor(),
    label = "t-SNE; Extended Data Fig. 4o",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = c(
            ggsci::pal_npg("nrc", alpha = 1)(
                embedding2$group %>% unique() %>% length() - 1
            ),
            "grey70"
        )
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank(),
        #
        legend.justification = c(0, 1),
        legend.position = c(0.075, 0.975)
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
(rownames(matrix_readcount_use)[gene_symbo_info$X2 %in% "HESX1"])
## [1] "ENSG00000163666_HESX1"
p_embedding_HESX1_p2 <- plot_embedding_value(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = matrix_cpm_use["ENSG00000163666_HESX1", embedding$cell],
    colorbar_position = c(0.86, 0.28),
    label = str_c("t-SNE; ", "ENSG00000163666_HESX1"),
    label_position = NULL,
    # label_position = c(label_x, label_y),
    geom_point_size = 1,
    sort_values = TRUE,
    FUN = NULL
)


color_values <- matrix_cpm_use["ENSG00000163666_HESX1", embedding$cell]
color_values[!embedding$cell_type %in% c("EPI")] <- NA
p_embedding_HESX1_p3 <- plot_embedding_value(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = color_values,
    colorbar_position = c(0.86, 0.28),
    label = str_c("t-SNE; ", "ENSG00000163666_HESX1", "; EPI"),
    label_position = NULL,
    # label_position = c(label_x, label_y),
    geom_point_size = 1,
    sort_values = TRUE,
    FUN = NULL
)


color_values <- matrix_cpm_use["ENSG00000163666_HESX1", embedding$cell]
color_values[!embedding$cell_type %in% c("PSA-EPI")] <- NA
p_embedding_HESX1_p4 <- plot_embedding_value(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = color_values,
    colorbar_position = c(0.86, 0.28),
    label = str_c("t-SNE; ", "ENSG00000163666_HESX1", "; PSA-EPI"),
    label_position = NULL,
    # label_position = c(label_x, label_y),
    geom_point_size = 1,
    sort_values = TRUE,
    FUN = NULL
)
p_embedding_HESX1_p1 +
    p_embedding_HESX1_p2 +
    p_embedding_HESX1_p3 +
    p_embedding_HESX1_p4 +
    plot_annotation(theme = theme(plot.margin = margin())) +
    plot_layout(guides = "keep")

Barplot

FEATURES_SELECTED <- c(
    "ENSG00000163666_HESX1",
    "ENSG00000164458_TBXT"
)

map(FEATURES_SELECTED, function(x) {
    embedding %>%
        mutate(feature_value = matrix_cpm_use[x, cell]) %>%
        group_by(develpmental_stage, cell_type) %>%
        summarise(mean_expr = mean(feature_value + 1)) %>%
        plot_barplot_feature(
            x = develpmental_stage,
            y = mean_expr,
            z = "cell_type",
            title = x
        )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(ncol = 1) +
    plot_annotation(
        tag_levels = c("A"),
        theme = theme(plot.margin = margin())
    ) &
    theme(
        plot.tag.position = c(0, 1),
        plot.tag = element_text(
            family = "Arial",
            size = 7,
            hjust = 0,
            vjust = 0
        )
    )
## `summarise()` regrouping output by 'develpmental_stage' (override with `.groups` argument)
## `summarise()` regrouping output by 'develpmental_stage' (override with `.groups` argument)

Development of the trophoblast lineage

# Table S8.5 Group information of 352 TrBs in extended data figure 8j_o.
table_s8_5 <- tibble::tribble(
    ~sample_id, ~day, ~group,
    "D6A1B1", "D6", "Pre-CTB",
    "D6A1B2", "D6", "Pre-CTB",
    "D6A1S1", "D6", "Pre-CTB",
    "D6A1S2", "D6", "Pre-CTB",
    "D6A1S3", "D6", "Pre-CTB",
    "D6A1S4", "D6", "Pre-CTB",
    "D6A2B1", "D6", "Pre-CTB",
    "D6A2B2", "D6", "Pre-CTB",
    "D6A2B4", "D6", "Pre-CTB",
    "D6A2S6", "D6", "Pre-CTB",
    "D6A2S7", "D6", "Pre-CTB",
    "D6A2S8", "D6", "Pre-CTB",
    "D6A3B1", "D6", "Pre-CTB",
    "D6A3B2", "D6", "Pre-CTB",
    "D6A3S1", "D6", "Pre-CTB",
    "D6A3S5", "D6", "Pre-CTB",
    "D6A4B3", "D6", "Pre-CTB",
    "D6A4B4", "D6", "Pre-CTB",
    "D6A4S4", "D6", "Pre-CTB",
    "D6A4S5", "D6", "Pre-CTB",
    "D6A4S6", "D6", "Pre-CTB",
    "D6A4S7", "D6", "Pre-CTB",
    "D6A5B3", "D6", "Pre-CTB",
    "D6A5B4", "D6", "Pre-CTB",
    "D6A5S1", "D6", "Pre-CTB",
    "D6A5S7", "D6", "Pre-CTB",
    "D7A1B1", "D7", "Pre-CTB",
    "D7A1B3", "D7", "Pre-CTB",
    "D7A1B7", "D7", "Pre-CTB",
    "D7A1B8", "D7", "Pre-CTB",
    "D7A1S14", "D7", "Pre-CTB",
    "D7A1S15", "D7", "Pre-CTB",
    "D7A1S1", "D7", "Pre-CTB",
    "D7A1S5", "D7", "Pre-CTB",
    "D7A1S6", "D7", "Pre-CTB",
    "D7A2B4", "D7", "Pre-CTB",
    "D7A2B5", "D7", "Pre-CTB",
    "D7A2S14", "D7", "Pre-CTB",
    "D7A2S1", "D7", "Pre-CTB",
    "D7A2S2", "D7", "Pre-CTB",
    "D9A4S4", "D9", "Pre-CTB",
    "D9A4S14", "D9", "Pre-CTB",
    "D7A2B1", "D7", "Post-CTB",
    "D7A2S3", "D7", "Post-CTB",
    "D7A1B5", "D7", "Post-CTB",
    "D7A1S11", "D7", "Post-CTB",
    "D7A1S7", "D7", "Post-CTB",
    "D7A1S9", "D7", "Post-CTB",
    "D7A2B6", "D7", "Post-CTB",
    "D7A2B8", "D7", "Post-CTB",
    "D7A2S10", "D7", "Post-CTB",
    "D7A2S16", "D7", "Post-CTB",
    "D7A2S6", "D7", "Post-CTB",
    "D7A3B10", "D7", "Post-CTB",
    "D7A3B1", "D7", "Post-CTB",
    "D7A3B3", "D7", "Post-CTB",
    "D7A3S10", "D7", "Post-CTB",
    "D7A3S12", "D7", "Post-CTB",
    "D7A3S14", "D7", "Post-CTB",
    "D7A3S1", "D7", "Post-CTB",
    "D7A3S3", "D7", "Post-CTB",
    "D7A3S4", "D7", "Post-CTB",
    "D7A3S5", "D7", "Post-CTB",
    "D7A4B3", "D7", "Post-CTB",
    "D7A4B5", "D7", "Post-CTB",
    "D7A4B6", "D7", "Post-CTB",
    "D7A4B8", "D7", "Post-CTB",
    "D7A4S13", "D7", "Post-CTB",
    "D7A4S14", "D7", "Post-CTB",
    "D7A4S15", "D7", "Post-CTB",
    "D7A4S1", "D7", "Post-CTB",
    "D8_8B2", "D8", "Post-CTB",
    "D8_8B4", "D8", "Post-CTB",
    "D8_8S1", "D8", "Post-CTB",
    "D8_8S3", "D8", "Post-CTB",
    "D8_8S4", "D8", "Post-CTB",
    "D8_8S5", "D8", "Post-CTB",
    "D8_8S6", "D8", "Post-CTB",
    "D8_8S7", "D8", "Post-CTB",
    "D8_8S8", "D8", "Post-CTB",
    "D8A5B8", "D8", "Post-CTB",
    "D8A5S14", "D8", "Post-CTB",
    "D8A5S1", "D8", "Post-CTB",
    "D8A5S4", "D8", "Post-CTB",
    "D8A6B1", "D8", "Post-CTB",
    "D8A6B3", "D8", "Post-CTB",
    "D8A6S5", "D8", "Post-CTB",
    "D9A1S8", "D9", "Post-CTB",
    "D9A2B5", "D9", "Post-CTB",
    "D9A2S1", "D9", "Post-CTB",
    "D9A2S2", "D9", "Post-CTB",
    "D9A2S3", "D9", "Post-CTB",
    "D9A2S4", "D9", "Post-CTB",
    "D8A1B2", "D8", "Early-EVT",
    "D8A1B3", "D8", "Early-EVT",
    "D8A1B6", "D8", "Early-EVT",
    "D8A1S1", "D8", "Early-EVT",
    "D8A1S3", "D8", "Early-EVT",
    "D8A1S7", "D8", "Early-EVT",
    "D8A2S12", "D8", "Early-EVT",
    "D8A2S24", "D8", "Early-EVT",
    "D8A2S3", "D8", "Early-EVT",
    "D8A2S4", "D8", "Early-EVT",
    "D8A3S12", "D8", "Early-EVT",
    "D8A3S7", "D8", "Early-EVT",
    "D8A5B7", "D8", "Early-EVT",
    "D8A6B6", "D8", "Early-EVT",
    "D8A6S15", "D8", "Early-EVT",
    "D9A1B16", "D9", "Early-EVT",
    "D9A1B1", "D9", "Early-EVT",
    "D9A1B3", "D9", "Early-EVT",
    "D9A1S23", "D9", "Early-EVT",
    "D9A1S26", "D9", "Early-EVT",
    "D9A1S2", "D9", "Early-EVT",
    "D9A1S3", "D9", "Early-EVT",
    "D9A1S7", "D9", "Early-EVT",
    "D9A2B3", "D9", "Early-EVT",
    "D9A2B8", "D9", "Early-EVT",
    "D9A3B1", "D9", "Early-EVT",
    "D9A3B7", "D9", "Early-EVT",
    "D9A3S1", "D9", "Early-EVT",
    "D9A3S2", "D9", "Early-EVT",
    "D9A3S3", "D9", "Early-EVT",
    "D9A4B2", "D9", "Early-EVT",
    "D9A4B4", "D9", "Early-EVT",
    "D9A4B7", "D9", "Early-EVT",
    "D9A4B8", "D9", "Early-EVT",
    "D9A4S10", "D9", "Early-EVT",
    "D9A4S11", "D9", "Early-EVT",
    "D9A4S6", "D9", "Early-EVT",
    "D9A4S7", "D9", "Early-EVT",
    "D9A4S9", "D9", "Early-EVT",
    "D9A5B5", "D9", "Early-EVT",
    "D9A5S10", "D9", "Early-EVT",
    "D9A5S3", "D9", "Early-EVT",
    "D9A5S8", "D9", "Early-EVT",
    "D9A6B6", "D9", "Early-EVT",
    "D9A6B8", "D9", "Early-EVT",
    "D9A6S10", "D9", "Early-EVT",
    "D9A6S14", "D9", "Early-EVT",
    "D9A6S15", "D9", "Early-EVT",
    "D9A6S5", "D9", "Early-EVT",
    "D10A1B17", "D10", "Early-EVT",
    "D10A1S10", "D10", "Early-EVT",
    "D10A1S11", "D10", "Early-EVT",
    "D10A1S12", "D10", "Early-EVT",
    "D10A1S1", "D10", "Early-EVT",
    "D10A1S3", "D10", "Early-EVT",
    "D10A1S9", "D10", "Early-EVT",
    "D10A2B2", "D10", "Early-EVT",
    "D10A2S1", "D10", "Early-EVT",
    "D10A2S21", "D10", "Early-EVT",
    "D10A3B17", "D10", "Early-EVT",
    "D10A3B2", "D10", "Early-EVT",
    "D10A3B4", "D10", "Early-EVT",
    "D10A3B5", "D10", "Early-EVT",
    "D10A3B7", "D10", "Early-EVT",
    "D10A3B9", "D10", "Early-EVT",
    "D10A3S1", "D10", "Early-EVT",
    "D10A3S2", "D10", "Early-EVT",
    "D10A3S35", "D10", "Early-EVT",
    "D10A3S7", "D10", "Early-EVT",
    "D10A3S9", "D10", "Early-EVT",
    "D10A4B3", "D10", "Early-EVT",
    "D10A4S14", "D10", "Early-EVT",
    "D10A4S16", "D10", "Early-EVT",
    "D10A4S7", "D10", "Early-EVT",
    "D10A4S9", "D10", "Early-EVT",
    "D10A5S3", "D10", "Early-EVT",
    "D10A6S10", "D10", "Early-EVT",
    "D12A3B4", "D12", "Early-EVT",
    "D12A3S11", "D12", "Early-EVT",
    "D12A3S12", "D12", "Early-EVT",
    "D12A3S17", "D12", "Early-EVT",
    "D12A3S19", "D12", "Early-EVT",
    "D12A3S21", "D12", "Early-EVT",
    "D12A3S25", "D12", "Early-EVT",
    "D12A3S28", "D12", "Early-EVT",
    "D12A3S31", "D12", "Early-EVT",
    "D12A3S4", "D12", "Early-EVT",
    "D12A3S5", "D12", "Early-EVT",
    "D12A3S6", "D12", "Early-EVT",
    "D12A3S8", "D12", "Early-EVT",
    "D12A3S9", "D12", "Early-EVT",
    "D12A4S12", "D12", "Early-EVT",
    "D12A4S16", "D12", "Early-EVT",
    "D12A4S17", "D12", "Early-EVT",
    "D12A4S2", "D12", "Early-EVT",
    "D12A4S9", "D12", "Early-EVT",
    "D12A5B6", "D12", "Early-EVT",
    "D12A5S13", "D12", "Early-EVT",
    "D12A5S18", "D12", "Early-EVT",
    "D14A3S25", "D14", "Early-EVT",
    "D14_3S9", "D14", "Early-EVT",
    "D8A2B2", "D8", "Early-STB",
    "D8A3S2", "D8", "Early-STB",
    "D8A1B10", "D8", "Early-STB",
    "D8A1B4", "D8", "Early-STB",
    "D8A2B1", "D8", "Early-STB",
    "D8A2B5", "D8", "Early-STB",
    "D8A2S1", "D8", "Early-STB",
    "D8A3B10", "D8", "Early-STB",
    "D8A3B1", "D8", "Early-STB",
    "D8A3B4", "D8", "Early-STB",
    "D8A3S13", "D8", "Early-STB",
    "D8A3S1", "D8", "Early-STB",
    "D8A3S28", "D8", "Early-STB",
    "D8A3S5", "D8", "Early-STB",
    "D8A3S8", "D8", "Early-STB",
    "D9A2B2", "D9", "Early-STB",
    "D9A1B15", "D9", "Early-STB",
    "D9A1B2", "D9", "Early-STB",
    "D9A1B4", "D9", "Early-STB",
    "D9A1S1", "D9", "Early-STB",
    "D9A2B1", "D9", "Early-STB",
    "D9A3B2", "D9", "Early-STB",
    "D9A3B3", "D9", "Early-STB",
    "D9A3B4", "D9", "Early-STB",
    "D9A3S11", "D9", "Early-STB",
    "D9A3S15", "D9", "Early-STB",
    "D9A5S6", "D9", "Early-STB",
    "D9A6B1", "D9", "Early-STB",
    "D10A1S7", "D10", "Early-STB",
    "D10A1B11", "D10", "Early-STB",
    "D10A1B1", "D10", "Early-STB",
    "D10A1B2", "D10", "Early-STB",
    "D10A1B3", "D10", "Early-STB",
    "D10A1B4", "D10", "Early-STB",
    "D10A1B5", "D10", "Early-STB",
    "D10A1B7", "D10", "Early-STB",
    "D10A1B8", "D10", "Early-STB",
    "D10A1S13", "D10", "Early-STB",
    "D10A1S2", "D10", "Early-STB",
    "D10A1S4", "D10", "Early-STB",
    "D10A2B4", "D10", "Early-STB",
    "D10A2B6", "D10", "Early-STB",
    "D10A2S2", "D10", "Early-STB",
    "D10A3B3", "D10", "Early-STB",
    "D10A3B6", "D10", "Early-STB",
    "D10A3B8", "D10", "Early-STB",
    "D10A4B7", "D10", "Early-STB",
    "D10A4B8", "D10", "Early-STB",
    "D10A4S11", "D10", "Early-STB",
    "D10A4S4", "D10", "Early-STB",
    "D10A4S8", "D10", "Early-STB",
    "D10A5B1", "D10", "Early-STB",
    "D10A5B8", "D10", "Early-STB",
    "D10A5S16", "D10", "Early-STB",
    "D12A3S18", "D12", "Early-STB",
    "D12A3S20", "D12", "Early-STB",
    "D12_1B4", "D12", "Early-STB",
    "D12A3B12", "D12", "Early-STB",
    "D12A3B8", "D12", "Early-STB",
    "D12A3S1", "D12", "Early-STB",
    "D12A3S22", "D12", "Early-STB",
    "D12A3S30", "D12", "Early-STB",
    "D12A3S7", "D12", "Early-STB",
    "D14_1S10", "D14", "Early-STB",
    "D14A1B26", "D14", "Early-STB",
    "D14A1S34", "D14", "Early-STB",
    "D14A1S36", "D14", "Early-STB",
    "D10A2B1", "D10", "STB",
    "D10A2B3", "D10", "STB",
    "D10A3S10", "D10", "STB",
    "D10A3S18", "D10", "STB",
    "D10A5B3", "D10", "STB",
    "D12_2S1", "D12", "STB",
    "D12A3B10", "D12", "STB",
    "D12A3B11", "D12", "STB",
    "D12A3B13", "D12", "STB",
    "D12A3B15", "D12", "STB",
    "D12A3B16", "D12", "STB",
    "D12A3B2", "D12", "STB",
    "D12A3B3", "D12", "STB",
    "D12A3B5", "D12", "STB",
    "D12A3B6", "D12", "STB",
    "D12A3B7", "D12", "STB",
    "D12A3B9", "D12", "STB",
    "D12A3S14", "D12", "STB",
    "D12A3S29", "D12", "STB",
    "D12A4B15", "D12", "STB",
    "D12A4B16", "D12", "STB",
    "D12A4B5", "D12", "STB",
    "D12A4B8", "D12", "STB",
    "D12A4B9", "D12", "STB",
    "D12A4S21", "D12", "STB",
    "D12A5B15", "D12", "STB",
    "D12A5B9", "D12", "STB",
    "D14_2S1", "D14", "STB",
    "D14_1B2", "D14", "STB",
    "D14A1B10", "D14", "STB",
    "D14A1B12", "D14", "STB",
    "D14A1B18", "D14", "STB",
    "D14A1B20", "D14", "STB",
    "D14A1B22", "D14", "STB",
    "D14A1B23", "D14", "STB",
    "D14A1B24", "D14", "STB",
    "D14A1B25", "D14", "STB",
    "D14A1S44", "D14", "STB",
    "D14A1S53", "D14", "STB",
    "D14A1S63", "D14", "STB",
    "D14A2B16", "D14", "STB",
    "D14A2B4", "D14", "STB",
    "D14A2B7", "D14", "STB",
    "D14A2S19", "D14", "STB",
    "D14A2S29", "D14", "STB",
    "D14A3B14", "D14", "STB",
    "D14A3S18", "D14", "STB",
    "D14_2S2", "D14", "STB",
    "D10A5S12", "D10", "EVT",
    "D12_1B3", "D12", "EVT",
    "D12_2B2", "D12", "EVT",
    "D12_2B9", "D12", "EVT",
    "D12A5B5", "D12", "EVT",
    "D14A2S15", "D14", "EVT",
    "D14A3S27", "D14", "EVT",
    "D14A3S5", "D14", "EVT",
    "D14_1B1", "D14", "EVT",
    "D14_1B5", "D14", "EVT",
    "D14_1S2", "D14", "EVT",
    "D14A1B17", "D14", "EVT",
    "D14A1B19", "D14", "EVT",
    "D14A2B12", "D14", "EVT",
    "D14A2B13", "D14", "EVT",
    "D14A2B1", "D14", "EVT",
    "D14A2B2", "D14", "EVT",
    "D14A2B9", "D14", "EVT",
    "D14A2S13", "D14", "EVT",
    "D14A2S17", "D14", "EVT",
    "D14A2S1", "D14", "EVT",
    "D14A2S21", "D14", "EVT",
    "D14A2S23", "D14", "EVT",
    "D14A2S27", "D14", "EVT",
    "D14A2S28", "D14", "EVT",
    "D14A2S5", "D14", "EVT",
    "D14A2S6", "D14", "EVT",
    "D14A3B10", "D14", "EVT",
    "D14A3B12", "D14", "EVT",
    "D14A3B2", "D14", "EVT",
    "D14A3B7", "D14", "EVT",
    "D14A3S14", "D14", "EVT",
    "D14A3S19", "D14", "EVT",
    "D14A3S23", "D14", "EVT",
    "D14A3S26", "D14", "EVT",
    "D14A3S28", "D14", "EVT",
    "D14A3S30", "D14", "EVT",
    "D14A3S7", "D14", "EVT",
    "D14A3S8", "D14", "EVT",
    "D14_3B5", "D14", "EVT",
    "D14_3B6", "D14", "EVT",
    "D14_2B1", "D14", "EVT",
    "D14_2B3", "D14", "EVT"
)
embedding2 <- embedding %>%
    left_join(
        table_s8_5[, c("sample_id", "group")],
        by = "sample_id"
    )

color_value_factors <- embedding2 %>%
    mutate(
        group = ifelse(is.na(group), "N/A", group),
        group = factor(
            group,
            levels = c(
                "Pre-CTB",
                "Post-CTB",
                "Early-EVT",
                "EVT",
                "Early-STB",
                "STB",
                "N/A"
            )
        )
    ) %>% 
    pull(group)
plot_embedding(
    embedding = embedding2[, c("x_tsne", "y_tsne")],
    color_values = color_value_factors,
    label = "t-SNE; Extended Data Fig. 8j",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = c(
            ggsci::pal_npg("nrc", alpha = 1)(
                embedding2$group %>% unique() %>% length() - 1
            ),
            "grey70"
        )
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank() # ,
        #
        # legend.justification = c(0, 1),
        # legend.position = c(0.075, 0.975)
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    ) +
    p_embedding_cluster_cell_type +
    plot_annotation(theme = theme(plot.margin = margin())) +
    plot_layout(guides = "keep")
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

Epiblast development and transition

# Table S8.6 Group information of EPIs.
# Group information of 222 cells in fig4 (also used in extended data fig 9k-n and 10a-c)
table_s8_6 <- tibble::tribble(
    ~sample_id, ~day, ~group,
    "D6N1B23", "D6", "ICM",
    "D6N1B6", "D6", "ICM",
    "D6N1S19", "D6", "ICM",
    "D6N1S35", "D6", "ICM",
    "D6N2B11", "D6", "ICM",
    "D6N2B12", "D6", "ICM",
    "D6N2B28", "D6", "ICM",
    "D6N2B7", "D6", "ICM",
    "D6A1B1", "D6", "ICM",
    "D6A1B2", "D6", "ICM",
    "D6A1S1", "D6", "ICM",
    "D6A1S3", "D6", "ICM",
    "D6A1S4", "D6", "ICM",
    "D6A2B1", "D6", "ICM",
    "D6A2B4", "D6", "ICM",
    "D6A2S6", "D6", "ICM",
    "D6A2S7", "D6", "ICM",
    "D6A2S8", "D6", "ICM",
    "D6A3B1", "D6", "ICM",
    "D6A3B2", "D6", "ICM",
    "D6A3S1", "D6", "ICM",
    "D6A3S5", "D6", "ICM",
    "D6A4B3", "D6", "ICM",
    "D6A4B4", "D6", "ICM",
    "D6A4S4", "D6", "ICM",
    "D6A4S5", "D6", "ICM",
    "D6A4S6", "D6", "ICM",
    "D6A4S7", "D6", "ICM",
    "D6A5B3", "D6", "ICM",
    "D6A5B4", "D6", "ICM",
    "D6A5S1", "D6", "ICM",
    "D6A5S7", "D6", "ICM",
    "D7N1B5", "D7", "ICM",
    "D7N1S18", "D7", "ICM",
    "D7A1B1", "D7", "ICM",
    "D7A1B3", "D7", "ICM",
    "D7A1B7", "D7", "ICM",
    "D7A1B8", "D7", "ICM",
    "D7A1S1", "D7", "ICM",
    "D7A1S14", "D7", "ICM",
    "D7A1S15", "D7", "ICM",
    "D7A1S5", "D7", "ICM",
    "D7A1S6", "D7", "ICM",
    "D7A2B1", "D7", "ICM",
    "D7A2B4", "D7", "ICM",
    "D7A2B5", "D7", "ICM",
    "D7A2S1", "D7", "ICM",
    "D7A2S14", "D7", "ICM",
    "D7A2S2", "D7", "ICM",
    "D7A2S3", "D7", "ICM",
    "D9A4S14", "D9", "ICM",
    "D9A4S4", "D9", "ICM",
    "D6N1S1", "D6", "PreEPI",
    "D6N1S15", "D6", "PreEPI",
    "D6N1S3", "D6", "PreEPI",
    "D6N1S33", "D6", "PreEPI",
    "D6N1S34", "D6", "PreEPI",
    "D6N1S4", "D6", "PreEPI",
    "D6N1S42", "D6", "PreEPI",
    "D6N1S9", "D6", "PreEPI",
    "D6N2B1", "D6", "PreEPI",
    "D6N2B18", "D6", "PreEPI",
    "D6N2B2", "D6", "PreEPI",
    "D6N2B8", "D6", "PreEPI",
    "D6N2S11", "D6", "PreEPI",
    "D6N2S2", "D6", "PreEPI",
    "D6N2S35", "D6", "PreEPI",
    "D6N3B12", "D6", "PreEPI",
    "D6N3B7", "D6", "PreEPI",
    "D6N3S11", "D6", "PreEPI",
    "D6N3S2", "D6", "PreEPI",
    "D6N3S22", "D6", "PreEPI",
    "D6N3S28", "D6", "PreEPI",
    "D6N3S35", "D6", "PreEPI",
    "D6N3S40", "D6", "PreEPI",
    "D6N3S51", "D6", "PreEPI",
    "D6A1S2", "D6", "PreEPI",
    "D6A2B2", "D6", "PreEPI",
    "D6A3S4", "D6", "PreEPI",
    "D6A5S8", "D6", "PreEPI",
    "D7N1B1", "D7", "PreEPI",
    "D7N1B7", "D7", "PreEPI",
    "D7N1B9", "D7", "PreEPI",
    "D7N1S15", "D7", "PreEPI",
    "D7N1S19", "D7", "PreEPI",
    "D7N1S21", "D7", "PreEPI",
    "D7N1S24", "D7", "PreEPI",
    "D7N1S27", "D7", "PreEPI",
    "D7N1S30", "D7", "PreEPI",
    "D7N1S7", "D7", "PreEPI",
    "D7N1S9", "D7", "PreEPI",
    "D7A1S13", "D7", "PreEPI",
    "D7A1S16", "D7", "PreEPI",
    "D7A3B8", "D7", "PreEPI",
    "D7A3S8", "D7", "PreEPI",
    "D8_8B1", "D8", "PreEPI",
    "D8_8S2", "D8", "PreEPI",
    "D8A1S11", "D8", "PreEPI",
    "D8A1S24", "D8", "PreEPI",
    "D8A2S10", "D8", "PreEPI",
    "D8A2S15", "D8", "PreEPI",
    "D8A2S2", "D8", "PreEPI",
    "D8A2S29", "D8", "PreEPI",
    "D8A6S7", "D8", "PreEPI",
    "D9A1S10", "D9", "PreEPI",
    "D9A4S1", "D9", "PreEPI",
    "D9A4S16", "D9", "PreEPI",
    "D9A4S5", "D9", "PreEPI",
    "D9A5S11", "D9", "PreEPI",
    "D10A1S34", "D10", "PreEPI",
    "D10A1S6", "D10", "PreEPI",
    "D10A2S3", "D10", "PreEPI",
    "D10A6S7", "D10", "PreEPI",
    "D14A1S20", "D14", "PreEPI",
    "D14A1S59", "D14", "PreEPI",
    "D8A1S31", "D8", "PostEPI",
    "D8A1S8", "D8", "PostEPI",
    "D9A1S28", "D9", "PostEPI",
    "D9A3S14", "D9", "PostEPI",
    "D9A4S3", "D9", "PostEPI",
    "D9A5S12", "D9", "PostEPI",
    "D9A5S9", "D9", "PostEPI",
    "D10A1S21", "D10", "PostEPI",
    "D10A1S23", "D10", "PostEPI",
    "D10A1S31", "D10", "PostEPI",
    "D10A1S32", "D10", "PostEPI",
    "D10A1S40", "D10", "PostEPI",
    "D10A2S17", "D10", "PostEPI",
    "D10A2S32", "D10", "PostEPI",
    "D10A6S4", "D10", "PostEPI",
    "D10A6S5", "D10", "PostEPI",
    "D10A6S8", "D10", "PostEPI",
    "D12A3B14", "D12", "PostEPI",
    "D12A3S10", "D12", "PostEPI",
    "D12A3S13", "D12", "PostEPI",
    "D12A3S15", "D12", "PostEPI",
    "D12A3S16", "D12", "PostEPI",
    "D12A3S2", "D12", "PostEPI",
    "D12A3S23", "D12", "PostEPI",
    "D12A3S24", "D12", "PostEPI",
    "D12A3S26", "D12", "PostEPI",
    "D12A3S27", "D12", "PostEPI",
    "D12A3S3", "D12", "PostEPI",
    "D12A3S32", "D12", "PostEPI",
    "D12A4S22", "D12", "PostEPI",
    "D12A4S26", "D12", "PostEPI",
    "D12A4S27", "D12", "PostEPI",
    "D12A4S29", "D12", "PostEPI",
    "D12A4S30", "D12", "PostEPI",
    "D12A4S7", "D12", "PostEPI",
    "D12A5S16", "D12", "PostEPI",
    "D12A5S19", "D12", "PostEPI",
    "D12A5S5", "D12", "PostEPI",
    "D12A5S6", "D12", "PostEPI",
    "D14A1B27", "D14", "PostEPI",
    "D14A1B28", "D14", "PostEPI",
    "D14A1S29", "D14", "PostEPI",
    "D14A1S33", "D14", "PostEPI",
    "D14A1S39", "D14", "PostEPI",
    "D14A1S41", "D14", "PostEPI",
    "D14A1S42", "D14", "PostEPI",
    "D14A1S43", "D14", "PostEPI",
    "D14A1S45", "D14", "PostEPI",
    "D14A1S46", "D14", "PostEPI",
    "D14A1S47", "D14", "PostEPI",
    "D14A1S48", "D14", "PostEPI",
    "D14A1S51", "D14", "PostEPI",
    "D14A1S56", "D14", "PostEPI",
    "D14A1S57", "D14", "PostEPI",
    "D14A1S58", "D14", "PostEPI",
    "D14A1S60", "D14", "PostEPI",
    "D14A1S61", "D14", "PostEPI",
    "D14A1S62", "D14", "PostEPI",
    "D14A1S64", "D14", "PostEPI",
    "D14A3S20", "D14", "PostEPI",
    "D14A3S29", "D14", "PostEPI",
    "D14_3S10", "D14", "PostEPI",
    "D14_3S15", "D14", "PostEPI",
    "D14_3S16", "D14", "PostEPI",
    "D14A1B1", "D14", "PSA_EPI",
    "D14A1B11", "D14", "PSA_EPI",
    "D14A1B13", "D14", "PSA_EPI",
    "D14A1B14", "D14", "PSA_EPI",
    "D14A1B15", "D14", "PSA_EPI",
    "D14A1B16", "D14", "PSA_EPI",
    "D14A1B2", "D14", "PSA_EPI",
    "D14A1B3", "D14", "PSA_EPI",
    "D14A1B4", "D14", "PSA_EPI",
    "D14A1B5", "D14", "PSA_EPI",
    "D14A1B6", "D14", "PSA_EPI",
    "D14A1B7", "D14", "PSA_EPI",
    "D14A1B8", "D14", "PSA_EPI",
    "D14A1B9", "D14", "PSA_EPI",
    "D14A1S1", "D14", "PSA_EPI",
    "D14A1S10", "D14", "PSA_EPI",
    "D14A1S11", "D14", "PSA_EPI",
    "D14A1S12", "D14", "PSA_EPI",
    "D14A1S13", "D14", "PSA_EPI",
    "D14A1S14", "D14", "PSA_EPI",
    "D14A1S15", "D14", "PSA_EPI",
    "D14A1S16", "D14", "PSA_EPI",
    "D14A1S17", "D14", "PSA_EPI",
    "D14A1S18", "D14", "PSA_EPI",
    "D14A1S19", "D14", "PSA_EPI",
    "D14A1S2", "D14", "PSA_EPI",
    "D14A1S21", "D14", "PSA_EPI",
    "D14A1S22", "D14", "PSA_EPI",
    "D14A1S23", "D14", "PSA_EPI",
    "D14A1S24", "D14", "PSA_EPI",
    "D14A1S25", "D14", "PSA_EPI",
    "D14A1S26", "D14", "PSA_EPI",
    "D14A1S27", "D14", "PSA_EPI",
    "D14A1S28", "D14", "PSA_EPI",
    "D14A1S3", "D14", "PSA_EPI",
    "D14A1S30", "D14", "PSA_EPI",
    "D14A1S31", "D14", "PSA_EPI",
    "D14A1S32", "D14", "PSA_EPI",
    "D14A1S5", "D14", "PSA_EPI",
    "D14A1S6", "D14", "PSA_EPI",
    "D14A1S7", "D14", "PSA_EPI",
    "D14A1S8", "D14", "PSA_EPI",
    "D14A1S9", "D14", "PSA_EPI"
)
embedding2 <- embedding %>%
    left_join(
        table_s8_6[, c("sample_id", "group")],
        by = "sample_id"
    )

color_value_factors <- embedding2$group
color_value_factors[is.na(embedding2$group)] <- "N/A"
color_value_factors <- color_value_factors %>%
    factor(., levels = c("ICM", "PSA_EPI", "PreEPI", "PostEPI", "N/A"))
# %>%
# forcats::fct_relevel("N/A", after = Inf)
plot_embedding(
    embedding = embedding2[, c("x_tsne", "y_tsne")],
    color_values = color_value_factors,
    label = "t-SNE; Fig. 4a",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = c(
            ggsci::pal_npg("nrc", alpha = 1)(
                embedding2$group %>% unique() %>% length() - 1
            ),
            "grey70"
        )
    ) +
    labs(color = NULL) +
    theme(
        legend.text = element_text(family = "Arial", size = 6),
        legend.key.size = unit(3, "mm"),
        legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm"),
        legend.background = element_blank() # ,
        #
        # legend.justification = c(0, 1),
        # legend.position = c(0.075, 0.975)
    ) +
    guides(
        colour = guide_legend(override.aes = list(size = 3))
    ) +
    p_embedding_cluster_cell_type +
    plot_annotation(theme = theme(plot.margin = margin())) +
    plot_layout(guides = "keep")
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

R session info

devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                       
##  version  R version 4.0.2 (2020-06-22)
##  os       macOS Catalina 10.15.6      
##  system   x86_64, darwin19.5.0        
##  ui       unknown                     
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/Chicago             
##  date     2020-07-30                  
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package        * version     date       lib
##  abind            1.4-5       2016-07-21 [1]
##  ape              5.4         2020-06-03 [1]
##  assertthat       0.2.1       2019-03-21 [1]
##  backports        1.1.8       2020-06-17 [1]
##  BayesFactor      0.9.12-4.2  2018-05-19 [1]
##  blob             1.2.1       2020-01-20 [1]
##  broom            0.7.0.9001  2020-07-28 [1]
##  callr            3.4.3       2020-03-28 [1]
##  cellranger       1.1.0       2016-07-27 [1]
##  circlize         0.4.10      2020-06-15 [1]
##  cli              2.0.2       2020-02-28 [1]
##  clue             0.3-57      2019-02-25 [1]
##  cluster          2.1.0       2019-06-19 [2]
##  coda             0.19-3      2019-07-05 [1]
##  codetools        0.2-16      2018-12-24 [2]
##  colorspace       1.4-1       2019-03-18 [1]
##  ComplexHeatmap   2.4.3       2020-07-25 [1]
##  cowplot          1.0.0       2019-07-11 [1]
##  crayon           1.3.4       2017-09-16 [1]
##  data.table       1.13.0      2020-07-24 [1]
##  DBI              1.1.0       2019-12-15 [1]
##  dbplyr           1.4.4.9000  2020-07-28 [1]
##  deldir           0.1-28      2020-07-15 [1]
##  desc             1.2.0       2018-05-01 [1]
##  devtools         2.3.1.9000  2020-07-29 [1]
##  digest           0.6.25      2020-02-23 [1]
##  dplyr          * 1.0.1       2020-07-28 [1]
##  ellipsis         0.3.1.9000  2020-07-18 [1]
##  evaluate         0.14        2019-05-28 [1]
##  extrafont      * 0.17        2014-12-08 [1]
##  extrafontdb      1.0         2012-06-11 [1]
##  fansi            0.4.1       2020-01-08 [1]
##  farver           2.0.3       2020-01-16 [1]
##  fastmap          1.0.1       2019-10-08 [1]
##  fitdistrplus     1.1-1       2020-05-19 [1]
##  forcats        * 0.5.0.9000  2020-05-28 [1]
##  fs               1.4.2.9000  2020-07-29 [1]
##  future           1.18.0      2020-07-09 [1]
##  future.apply     1.6.0       2020-07-01 [1]
##  generics         0.0.2       2018-11-29 [1]
##  GetoptLong       1.0.2       2020-07-06 [1]
##  ggplot2        * 3.3.2.9000  2020-07-29 [1]
##  ggrepel          0.9.0       2020-07-24 [1]
##  ggridges         0.5.2       2020-01-12 [1]
##  ggsci            2.9         2020-06-04 [1]
##  ggthemes         4.2.0       2019-05-13 [1]
##  GlobalOptions    0.1.2       2020-06-10 [1]
##  globals          0.12.5      2019-12-07 [1]
##  glue             1.4.1.9000  2020-07-07 [1]
##  goftest          1.2-2       2019-12-02 [1]
##  gridExtra        2.3         2017-09-09 [1]
##  gtable           0.3.0       2019-03-25 [1]
##  gtools           3.8.2       2020-03-31 [1]
##  haven            2.3.1       2020-06-01 [1]
##  hms              0.5.3       2020-01-08 [1]
##  htmltools        0.5.0       2020-06-16 [1]
##  htmlwidgets      1.5.1       2019-10-08 [1]
##  httpuv           1.5.4       2020-06-06 [1]
##  httr             1.4.2       2020-07-20 [1]
##  ica              1.0-2       2018-05-24 [1]
##  igraph           1.2.5       2020-03-19 [1]
##  irlba            2.3.3       2019-02-05 [1]
##  jpeg             0.1-8.1     2019-10-24 [1]
##  jsonlite         1.7.0       2020-06-25 [1]
##  KernSmooth       2.23-17     2020-04-26 [2]
##  knitr            1.29        2020-06-23 [1]
##  labeling         0.3         2014-08-23 [1]
##  later            1.1.0.1     2020-06-05 [1]
##  lattice          0.20-41     2020-04-02 [2]
##  lazyeval         0.2.2       2019-03-15 [1]
##  leiden           0.3.3       2020-02-04 [1]
##  lifecycle        0.2.0       2020-03-06 [1]
##  listenv          0.8.0       2019-12-05 [1]
##  lmtest           0.9-37      2019-04-30 [1]
##  lubridate        1.7.9       2020-07-11 [1]
##  magrittr       * 1.5.0.9000  2020-07-27 [1]
##  MASS             7.3-51.6    2020-04-26 [2]
##  Matrix         * 1.2-18      2019-11-27 [1]
##  MatrixModels     0.4-1       2015-08-22 [1]
##  memoise          1.1.0       2017-04-21 [1]
##  mgcv             1.8-31      2019-11-09 [2]
##  mime             0.9         2020-02-04 [1]
##  miniUI           0.1.1.1     2018-05-18 [1]
##  modelr           0.1.8.9000  2020-05-19 [1]
##  munsell          0.5.0       2018-06-12 [1]
##  mvtnorm          1.1-1       2020-06-09 [1]
##  nlme             3.1-148     2020-05-24 [2]
##  patchwork      * 1.0.1.9000  2020-06-22 [1]
##  pbapply          1.4-2       2019-08-31 [1]
##  pillar           1.4.6.9000  2020-07-21 [1]
##  pkgbuild         1.1.0.9000  2020-07-14 [1]
##  pkgconfig        2.0.3       2019-09-22 [1]
##  pkgload          1.1.0       2020-05-29 [1]
##  plotly           4.9.2.1     2020-04-04 [1]
##  plyr             1.8.6       2020-03-03 [1]
##  png              0.1-7       2013-12-03 [1]
##  polyclip         1.10-0      2019-03-14 [1]
##  prettyunits      1.1.1       2020-01-24 [1]
##  processx         3.4.3       2020-07-05 [1]
##  promises         1.1.1       2020-06-09 [1]
##  ps               1.3.3       2020-05-08 [1]
##  purrr          * 0.3.4.9000  2020-07-29 [1]
##  R6               2.4.1.9000  2020-07-18 [1]
##  RANN             2.6.1       2019-01-08 [1]
##  RColorBrewer     1.1-2       2014-12-07 [1]
##  Rcpp             1.0.5       2020-07-06 [1]
##  RcppAnnoy        0.0.16      2020-03-08 [1]
##  readr          * 1.3.1.9000  2020-07-16 [1]
##  readxl           1.3.1.9000  2020-05-28 [1]
##  remotes          2.2.0.9000  2020-07-23 [1]
##  reprex           0.3.0       2019-05-16 [1]
##  reshape2         1.4.4       2020-04-09 [1]
##  reticulate       1.16        2020-05-27 [1]
##  rjson            0.2.20      2018-06-08 [1]
##  rlang          * 0.4.7.9000  2020-07-29 [1]
##  rmarkdown        2.3.3       2020-07-25 [1]
##  ROCR             1.0-11      2020-05-02 [1]
##  rpart            4.1-15      2019-04-12 [2]
##  rprojroot        1.3-2       2018-01-03 [1]
##  rstudioapi       0.11.0-9000 2020-07-15 [1]
##  rsvd             1.0.3       2020-02-17 [1]
##  Rtsne            0.16        2020-07-03 [1]
##  Rttf2pt1         1.3.8       2020-01-10 [1]
##  rvest            0.3.6       2020-07-25 [1]
##  scales           1.1.1.9000  2020-07-24 [1]
##  sctransform      0.2.1       2019-12-17 [1]
##  sessioninfo      1.1.1.9000  2020-07-18 [1]
##  Seurat         * 3.2.0.9004  2020-07-28 [1]
##  shape            1.4.4       2018-02-07 [1]
##  shiny            1.5.0.9001  2020-07-28 [1]
##  spatstat         1.64-1      2020-05-12 [1]
##  spatstat.data    1.4-3       2020-01-26 [1]
##  spatstat.utils   1.17-0      2020-02-07 [1]
##  stringi          1.4.6       2020-02-17 [1]
##  stringr        * 1.4.0.9000  2020-06-01 [1]
##  styler         * 1.3.2.9000  2020-07-25 [1]
##  survival         3.2-3       2020-06-13 [2]
##  tensor           1.5         2012-05-05 [1]
##  testthat         2.99.0.9000 2020-07-28 [1]
##  tibble         * 3.0.3.9000  2020-07-21 [1]
##  tidyr          * 1.1.0.9000  2020-07-23 [1]
##  tidyselect       1.1.0.9000  2020-07-11 [1]
##  tidyverse      * 1.3.0.9000  2020-06-01 [1]
##  usethis          1.6.1.9001  2020-07-29 [1]
##  utf8             1.1.4       2018-05-24 [1]
##  uwot             0.1.8.9000  2020-07-19 [1]
##  vctrs            0.3.2.9000  2020-07-23 [1]
##  viridisLite      0.3.0       2018-02-01 [1]
##  wesanderson      0.3.6.9000  2020-06-05 [1]
##  withr            2.2.0       2020-04-20 [1]
##  xfun             0.16        2020-07-24 [1]
##  xml2             1.3.2       2020-04-23 [1]
##  xtable           1.8-4       2019-04-21 [1]
##  yaml             2.2.1       2020-02-01 [1]
##  yarrr            0.1.6       2020-07-23 [1]
##  zoo              1.8-8       2020-05-02 [1]
##  source                               
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.1)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Github (tidymodels/broom@762e3ad)    
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.1)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Bioconductor                         
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/dbplyr@a6ed629)    
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Github (r-lib/devtools@8d14704)      
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/dplyr@48aead4)     
##  Github (r-lib/ellipsis@57a5071)      
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/forcats@ab81d1b)   
##  Github (r-lib/fs@9e143f9)            
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  Github (tidyverse/ggplot2@b4bc293)   
##  Github (slowkow/ggrepel@4d0ef50)     
##  CRAN (R 4.0.0)                       
##  Github (nanxstats/ggsci@589fe17)     
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/glue@205f18b)      
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.1)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  Github (tidyverse/lubridate@de2ee09) 
##  Github (tidyverse/magrittr@0d14075)  
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/modelr@16168e0)    
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  Github (thomasp85/patchwork@82a5e03) 
##  CRAN (R 4.0.0)                       
##  Github (r-lib/pillar@8aef8f2)        
##  Github (r-lib/pkgbuild@3a87bd9)      
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/purrr@74d5d67)     
##  Github (r-lib/R6@1415d11)            
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/readr@2ab51b2)     
##  Github (tidyverse/readxl@3815961)    
##  Github (r-lib/remotes@d7fe461)       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Github (r-lib/rlang@1fb41d7)         
##  Github (rstudio/rmarkdown@204aa41)   
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Github (rstudio/rstudioapi@ed5dd25)  
##  CRAN (R 4.0.0)                       
##  Github (jkrijthe/Rtsne@14b195f)      
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  Github (r-lib/scales@9ff4757)        
##  CRAN (R 4.0.0)                       
##  Github (r-lib/sessioninfo@791705b)   
##  Github (satijalab/seurat@ad0008e)    
##  CRAN (R 4.0.0)                       
##  Github (rstudio/shiny@766b910)       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  Github (tidyverse/stringr@f70c4ba)   
##  Github (r-lib/styler@16d815e)        
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.2)                       
##  Github (r-lib/testthat@0af11cd)      
##  Github (tidyverse/tibble@b4eec19)    
##  Github (tidyverse/tidyr@3f49600)     
##  Github (tidyverse/tidyselect@69fdc96)
##  Github (hadley/tidyverse@8a0bb99)    
##  Github (r-lib/usethis@dbe57c0)       
##  CRAN (R 4.0.0)                       
##  Github (jlmelville/uwot@13a198f)     
##  Github (r-lib/vctrs@df8a659)         
##  CRAN (R 4.0.0)                       
##  Github (karthik/wesanderson@d90700a) 
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.2)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  CRAN (R 4.0.0)                       
##  Github (ndphillips/yarrr@e2e4488)    
##  CRAN (R 4.0.0)                       
## 
## [1] /usr/local/lib/R/4.0/site-library
## [2] /usr/local/Cellar/r/4.0.2_1/lib/R/library